From 4f0a1d9e6e247d731319362d8c58b1a1e81e2945 Mon Sep 17 00:00:00 2001 From: Yashvardhan4197 <20BCS4197@cuchd.in> Date: Mon, 26 Aug 2024 22:38:51 +0530 Subject: [PATCH 01/18] Added UnitCommand and ICommand --- Assets/Plugins.meta | 8 + Assets/Plugins/CodeAssist.meta | 8 + Assets/Plugins/CodeAssist/CHANGELOG.TXT | 135 + Assets/Plugins/CodeAssist/CHANGELOG.TXT.meta | 7 + Assets/Plugins/CodeAssist/Editor.meta | 8 + .../Plugins/CodeAssist/Editor/AboutWindow.cs | 70 + .../CodeAssist/Editor/AboutWindow.cs.meta | 11 + Assets/Plugins/CodeAssist/Editor/Assister.cs | 268 + .../CodeAssist/Editor/Assister.cs.meta | 11 + .../Editor/CodeAssistAssembly.asmdef | 16 + .../Editor/CodeAssistAssembly.asmdef.meta | 7 + .../CodeAssist/Editor/EditorCoroutines.meta | 8 + .../EditorCoroutines/EditorCoroutine.cs | 157 + .../EditorCoroutines/EditorCoroutine.cs.meta | 11 + .../EditorCoroutineUtility.cs | 128 + .../EditorCoroutineUtility.cs.meta | 11 + .../EditorCoroutines/EditorWaitForSeconds.cs | 49 + .../EditorWaitForSeconds.cs.meta | 11 + .../EditorWindowCoroutineExtension.cs | 109 + .../EditorWindowCoroutineExtension.cs.meta | 11 + .../CodeAssist/Editor/ExternalReferences.meta | 8 + .../Meryel.UnityCodeAssist.AsyncIO.deps.json | 56 + ...yel.UnityCodeAssist.AsyncIO.deps.json.meta | 7 + .../Meryel.UnityCodeAssist.AsyncIO.dll | Bin 0 -> 31744 bytes .../Meryel.UnityCodeAssist.AsyncIO.dll.meta | 33 + .../Meryel.UnityCodeAssist.NaCl.deps.json | 113 + ...Meryel.UnityCodeAssist.NaCl.deps.json.meta | 7 + .../Meryel.UnityCodeAssist.NaCl.dll | Bin 0 -> 30720 bytes .../Meryel.UnityCodeAssist.NaCl.dll.meta | 33 + .../Meryel.UnityCodeAssist.NaCl.xml | 517 + .../Meryel.UnityCodeAssist.NaCl.xml.meta | 7 + .../Meryel.UnityCodeAssist.NetMQ.deps.json | 472 + ...eryel.UnityCodeAssist.NetMQ.deps.json.meta | 7 + .../Meryel.UnityCodeAssist.NetMQ.dll | Bin 0 -> 263168 bytes .../Meryel.UnityCodeAssist.NetMQ.dll.meta | 33 + .../Meryel.UnityCodeAssist.NetMQ.xml | 12267 ++++++++++++++++ .../Meryel.UnityCodeAssist.NetMQ.xml.meta | 7 + ...ist.Serilog.Sinks.PersistentFile.deps.json | 72 + ...erilog.Sinks.PersistentFile.deps.json.meta | 7 + ...odeAssist.Serilog.Sinks.PersistentFile.dll | Bin 0 -> 31744 bytes ...sist.Serilog.Sinks.PersistentFile.dll.meta | 33 + .../Meryel.UnityCodeAssist.Serilog.deps.json | 86 + ...yel.UnityCodeAssist.Serilog.deps.json.meta | 7 + .../Meryel.UnityCodeAssist.Serilog.dll | Bin 0 -> 141824 bytes .../Meryel.UnityCodeAssist.Serilog.dll.meta | 33 + .../Meryel.UnityCodeAssist.Serilog.xml | 5715 +++++++ .../Meryel.UnityCodeAssist.Serilog.xml.meta | 7 + ...nityCodeAssist.SynchronizerModel.deps.json | 47 + ...odeAssist.SynchronizerModel.deps.json.meta | 7 + ...ryel.UnityCodeAssist.SynchronizerModel.dll | Bin 0 -> 18432 bytes ...UnityCodeAssist.SynchronizerModel.dll.meta | 33 + ...eryel.UnityCodeAssist.YamlDotNet.deps.json | 507 + ....UnityCodeAssist.YamlDotNet.deps.json.meta | 7 + .../Meryel.UnityCodeAssist.YamlDotNet.dll | Bin 0 -> 275968 bytes ...Meryel.UnityCodeAssist.YamlDotNet.dll.meta | 33 + .../Meryel.UnityCodeAssist.YamlDotNet.xml | 5980 ++++++++ ...Meryel.UnityCodeAssist.YamlDotNet.xml.meta | 7 + ...ariesForDotNetStandard20.unitypackage.meta | 7 + .../CodeAssist/Editor/FeedbackWindow.cs | 110 + .../CodeAssist/Editor/FeedbackWindow.cs.meta | 11 + Assets/Plugins/CodeAssist/Editor/Input.meta | 8 + .../Editor/Input/Binary2TextExec.cs | 146 + .../Editor/Input/Binary2TextExec.cs.meta | 11 + .../Editor/Input/InputManagerMonitor.cs | 151 + .../Editor/Input/InputManagerMonitor.cs.meta | 11 + .../CodeAssist/Editor/Input/Text2Yaml.cs | 215 + .../CodeAssist/Editor/Input/Text2Yaml.cs.meta | 11 + .../Editor/Input/UnityInputManager.cs | 411 + .../Editor/Input/UnityInputManager.cs.meta | 11 + .../CodeAssist/Editor/LazyInitializer.cs | 47 + .../CodeAssist/Editor/LazyInitializer.cs.meta | 11 + Assets/Plugins/CodeAssist/Editor/Logger.meta | 8 + .../CodeAssist/Editor/Logger/Attributes.cs | 22 + .../Editor/Logger/Attributes.cs.meta | 11 + .../CodeAssist/Editor/Logger/CommonTools.cs | 120 + .../Editor/Logger/CommonTools.cs.meta | 11 + .../Editor/Logger/DomainHashEnricher.cs | 36 + .../Editor/Logger/DomainHashEnricher.cs.meta | 11 + .../CodeAssist/Editor/Logger/ELogger.cs | 199 + .../CodeAssist/Editor/Logger/ELogger.cs.meta | 11 + .../CodeAssist/Editor/Logger/MemorySink.cs | 136 + .../Editor/Logger/MemorySink.cs.meta | 11 + .../CodeAssist/Editor/Logger/UnitySink.cs | 52 + .../Editor/Logger/UnitySink.cs.meta | 11 + .../CodeAssist/Editor/MainThreadDispatcher.cs | 45 + .../Editor/MainThreadDispatcher.cs.meta | 11 + Assets/Plugins/CodeAssist/Editor/Monitor.cs | 266 + .../Plugins/CodeAssist/Editor/Monitor.cs.meta | 11 + .../CodeAssist/Editor/NetMQInitializer.cs | 140 + .../Editor/NetMQInitializer.cs.meta | 11 + .../CodeAssist/Editor/NetMQPublisher.cs | 798 + .../CodeAssist/Editor/NetMQPublisher.cs.meta | 11 + .../CodeAssist/Editor/Preferences.meta | 8 + .../Preferences/PreferenceEntryHolder.cs | 65 + .../Preferences/PreferenceEntryHolder.cs.meta | 11 + .../Editor/Preferences/PreferenceMonitor.cs | 375 + .../Preferences/PreferenceMonitor.cs.meta | 11 + .../Preferences/PreferenceStorageAccessor.cs | 292 + .../PreferenceStorageAccessor.cs.meta | 11 + .../Editor/Preferences/RegistryMonitor.cs | 339 + .../Preferences/RegistryMonitor.cs.meta | 11 + .../Plugins/CodeAssist/Editor/ScriptFinder.cs | 312 + .../CodeAssist/Editor/ScriptFinder.cs.meta | 11 + .../Plugins/CodeAssist/Editor/StatusWindow.cs | 86 + .../CodeAssist/Editor/StatusWindow.cs.meta | 11 + .../Plugins/CodeAssist/Editor/TinyJson.meta | 8 + .../CodeAssist/Editor/TinyJson/JsonParser.cs | 376 + .../Editor/TinyJson/JsonParser.cs.meta | 11 + .../CodeAssist/Editor/TinyJson/JsonWriter.cs | 202 + .../Editor/TinyJson/JsonWriter.cs.meta | 11 + .../CodeAssist/Editor/UnityClassExtensions.cs | 327 + .../Editor/UnityClassExtensions.cs.meta | 11 + Assets/Plugins/CodeAssist/Editor/csc.rsp | 1 + Assets/Plugins/CodeAssist/Editor/csc.rsp.meta | 7 + Assets/Plugins/CodeAssist/GPT-NOTICE.TXT | 17 + Assets/Plugins/CodeAssist/GPT-NOTICE.TXT.meta | 7 + Assets/Plugins/CodeAssist/README.TXT | 90 + Assets/Plugins/CodeAssist/README.TXT.meta | 7 + .../CodeAssist/THIRD-PARTY-NOTICES.TXT | 1395 ++ .../CodeAssist/THIRD-PARTY-NOTICES.TXT.meta | 7 + Assets/Scripts/Commands.meta | 8 + Assets/Scripts/Commands/AbstractCommands.meta | 8 + .../Commands/AbstractCommands/ICommand.cs | 8 + .../AbstractCommands/ICommand.cs.meta | 11 + .../Commands/AbstractCommands/UnitCommands.cs | 19 + .../AbstractCommands/UnitCommands.cs.meta | 11 + Packages/manifest.json | 15 +- Packages/packages-lock.json | 105 +- ProjectSettings/ProjectSettings.asset | 162 +- ProjectSettings/ProjectVersion.txt | 4 +- ProjectSettings/boot.config | 0 131 files changed, 34585 insertions(+), 71 deletions(-) create mode 100644 Assets/Plugins.meta create mode 100644 Assets/Plugins/CodeAssist.meta create mode 100644 Assets/Plugins/CodeAssist/CHANGELOG.TXT create mode 100644 Assets/Plugins/CodeAssist/CHANGELOG.TXT.meta create mode 100644 Assets/Plugins/CodeAssist/Editor.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/AboutWindow.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/AboutWindow.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/Assister.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/Assister.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/CodeAssistAssembly.asmdef create mode 100644 Assets/Plugins/CodeAssist/Editor/CodeAssistAssembly.asmdef.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/EditorCoroutines.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorCoroutine.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorCoroutine.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorCoroutineUtility.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorCoroutineUtility.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorWaitForSeconds.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorWaitForSeconds.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorWindowCoroutineExtension.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorWindowCoroutineExtension.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.AsyncIO.deps.json create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.AsyncIO.deps.json.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.AsyncIO.dll create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.AsyncIO.dll.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.deps.json create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.deps.json.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.dll create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.dll.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.xml create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.xml.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NetMQ.deps.json create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NetMQ.deps.json.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NetMQ.dll create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NetMQ.dll.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NetMQ.xml create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NetMQ.xml.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile.deps.json create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile.deps.json.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile.dll create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile.dll.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.deps.json create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.deps.json.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.dll create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.dll.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.xml create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.xml.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.SynchronizerModel.deps.json create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.SynchronizerModel.deps.json.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.SynchronizerModel.dll create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.SynchronizerModel.dll.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.deps.json create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.deps.json.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.dll create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.dll.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.xml create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.xml.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ExternalReferences/SystemBinariesForDotNetStandard20.unitypackage.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/FeedbackWindow.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/FeedbackWindow.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/Input.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/Input/Binary2TextExec.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/Input/Binary2TextExec.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/Input/InputManagerMonitor.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/Input/InputManagerMonitor.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/Input/Text2Yaml.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/Input/Text2Yaml.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/Input/UnityInputManager.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/Input/UnityInputManager.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/LazyInitializer.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/LazyInitializer.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/Logger.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/Logger/Attributes.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/Logger/Attributes.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/Logger/CommonTools.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/Logger/CommonTools.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/Logger/DomainHashEnricher.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/Logger/DomainHashEnricher.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/Logger/ELogger.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/Logger/ELogger.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/Logger/MemorySink.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/Logger/MemorySink.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/Logger/UnitySink.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/Logger/UnitySink.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/MainThreadDispatcher.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/MainThreadDispatcher.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/Monitor.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/Monitor.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/NetMQInitializer.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/NetMQInitializer.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/NetMQPublisher.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/NetMQPublisher.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/Preferences.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceEntryHolder.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceEntryHolder.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceMonitor.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceMonitor.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceStorageAccessor.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceStorageAccessor.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/Preferences/RegistryMonitor.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/Preferences/RegistryMonitor.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/ScriptFinder.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/ScriptFinder.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/StatusWindow.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/StatusWindow.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/TinyJson.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/TinyJson/JsonParser.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/TinyJson/JsonParser.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/TinyJson/JsonWriter.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/TinyJson/JsonWriter.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/UnityClassExtensions.cs create mode 100644 Assets/Plugins/CodeAssist/Editor/UnityClassExtensions.cs.meta create mode 100644 Assets/Plugins/CodeAssist/Editor/csc.rsp create mode 100644 Assets/Plugins/CodeAssist/Editor/csc.rsp.meta create mode 100644 Assets/Plugins/CodeAssist/GPT-NOTICE.TXT create mode 100644 Assets/Plugins/CodeAssist/GPT-NOTICE.TXT.meta create mode 100644 Assets/Plugins/CodeAssist/README.TXT create mode 100644 Assets/Plugins/CodeAssist/README.TXT.meta create mode 100644 Assets/Plugins/CodeAssist/THIRD-PARTY-NOTICES.TXT create mode 100644 Assets/Plugins/CodeAssist/THIRD-PARTY-NOTICES.TXT.meta create mode 100644 Assets/Scripts/Commands.meta create mode 100644 Assets/Scripts/Commands/AbstractCommands.meta create mode 100644 Assets/Scripts/Commands/AbstractCommands/ICommand.cs create mode 100644 Assets/Scripts/Commands/AbstractCommands/ICommand.cs.meta create mode 100644 Assets/Scripts/Commands/AbstractCommands/UnitCommands.cs create mode 100644 Assets/Scripts/Commands/AbstractCommands/UnitCommands.cs.meta delete mode 100644 ProjectSettings/boot.config diff --git a/Assets/Plugins.meta b/Assets/Plugins.meta new file mode 100644 index 00000000..db2e0b0c --- /dev/null +++ b/Assets/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2d709e8bd3e925f43a7a9abd234ea9d5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist.meta b/Assets/Plugins/CodeAssist.meta new file mode 100644 index 00000000..71a77b3d --- /dev/null +++ b/Assets/Plugins/CodeAssist.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 54846ff7f21ee954986441d8d2b6af04 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/CHANGELOG.TXT b/Assets/Plugins/CodeAssist/CHANGELOG.TXT new file mode 100644 index 00000000..71ecd0b1 --- /dev/null +++ b/Assets/Plugins/CodeAssist/CHANGELOG.TXT @@ -0,0 +1,135 @@ +List of new features, bug fixes and improvements + +# Version 1.1.12 +* External binary files have been customized and minimized +* Domain reloading time have been reduced +* Stability and usability improvements for exporter/updater +* Bugfix for Feedback window + +# Version 1.1.11 +* Gpt completion endpoint fixed for OpenAI API changes +* Bugfix for Input Manager monitor +* Bugfix for logging to Visual Studio output window +* Bugfix for About window + +# Version 1.1.10 +* Version skipped for compatibility with other assets + +# Version 1.1.9 +* Gpt support for chat and edit +* More options added for Gpt +* Overall stability improvements +* Exporter shows file locks if update/export is unsuccessful + +# Version 1.1.8 +* Bugfix for non-Unity solutions + +# Version 1.1.7 +* Bugfix for Visual Studio freeze + +# Version 1.1.6 +* Gpt support added for shader files +* Stability improvements for Unity.ScriptFinder + +# Version 1.1.5 +* Stability and usability improvements for exporter/updater +* Bugfix for Transformer Linq and Auto Input Manager +* Usability for Transformer window, disabling it if not connected to Unity +* Enhancement for completions, sorting numerical values correctly https://github.com/merryyellow/Unity-Code-Assist/issues/6 + +# Version 1.1.4 +* Auto Input Manager is now compatible with binary asset files +* Stability and usability improvements for Transformer windows + +# Version 1.1.3 +* Analyzers are working at a separate process https://github.com/merryyellow/Unity-Code-Assist/issues/20 +* Inline visuals stability and performance improvements https://github.com/merryyellow/Unity-Code-Assist/issues/22 https://github.com/merryyellow/Unity-Code-Assist/issues/24 +* Exporter/updater stability improvements https://github.com/merryyellow/Unity-Code-Assist/issues/19 https://github.com/merryyellow/Unity-Code-Assist/issues/23 +* Transformer window stability improvements https://github.com/merryyellow/Unity-Code-Assist/issues/21 +* Bugfix for Gpt busy icon positioning https://github.com/merryyellow/Unity-Code-Assist/issues/24 + +# Version 1.1.2 +* Bugfix for Yaml file parsing of InputManager + +# Version 1.1.1 +* Bugfix for error handling of binary file parsing + +# Version 1.1.0 +* New feature: Generative AI. Use OpenAI ChatGPT within comments to complete your code +* New feature: Visual Studio menus. Access Unity Code Assist from "Extensions"->"Unity Code Assist" +* New code completions: PlayerPrefs, EditorPrefs and Input classes' methods can be auto completed +* New inline visuals: PlayerPrefs, EditorPrefs and Input classes' methods can display inline information +* New code transformer: Auto Input Manager. Converts legacy input code into the new Input Manager + +# Version 1.0.0.21 +* Stability improvements for Unity ScriptFinder class + +# Version 1.0.0.20 +* Bugfix for crash at startup https://github.com/merryyellow/Unity-Code-Assist/issues/18 + +# Version 1.0.0.19 +* More logging for error tracking + +# Version 1.0.0.18 +* Overall stability improvements, nullable references enabled for codebase +* Stability improvements for communications, when reconnection occurs + +# Version 1.0.0.17 +* Stability improvements for Unity ScriptFinder class + +# Version 1.0.0.16 +* Bugfix for Visual Studio events concurrency + +# Version 1.0.0.15 +* Visual Studio events are reimplemented for both stability and performance +* Removal of possible Task deadlocks +* Usability improvements for exporter/updater +* Bugfix for exporter/updater, where prompts can appear twice +* Bugfix for Inline Texts, where const null identifier may raise exceptions https://github.com/merryyellow/Unity-Code-Assist/issues/16 +* Bugfix for communications, where tags&layers are sent for the first time + +# Version 1.0.0.14 +* Usability improvements for Visual Studio Status window where project is not a Unity project +* Bugfix for communication reinitialization, where projects are closed and opened from Visual Studio https://github.com/merryyellow/Unity-Code-Assist/issues/15 +* Bugfix for Visual Studio events' initialization https://github.com/merryyellow/Unity-Code-Assist/issues/14 + +# Version 1.0.0.13 +* Bugfix for Unity where target object is neither Component nor MonoBehaviour https://github.com/merryyellow/Unity-Code-Assist/issues/13 + +# Version 1.0.0.12 +* New Feature: Updating Unity asset from Visual Studio +* New Feature: Online error reporting of Unity errors +* Usability improvement for Visual Studio Feedback window +* Bugfix for Inline Texts where there is no class declaration https://github.com/merryyellow/Unity-Code-Assist/issues/5 +* Bugfix for Code Completion where there is no class declaration https://github.com/merryyellow/Unity-Code-Assist/issues/10 +* Bugfix for Visual Studio output window, where it may be unavailable + +# Version 1.0.0.11 +* Bugfix for Visual Studio events' initialization https://github.com/merryyellow/Unity-Code-Assist/issues/3 +* Exporter now has more logs + +# Version 1.0.0.10 +* Bugfix for Inline Texts where leading trivia is absent https://github.com/merryyellow/Unity-Code-Assist/issues/1 +* Bugfix for Visual Studio events' initialization https://github.com/merryyellow/Unity-Code-Assist/issues/2 + +# Version 1.0.0.9 +* Minor adjustments for initialization logging + +# Version 1.0.0.8 +* Online analytics added +* Bugfix for Inline Texts, Visual Studio code preview screen does not raise any exception anymore + +# Version 1.0.0.7 +* Online error tracker added + +# Version 1.0.0.6 +* Exporter is always disabled for non Unity projects + +# Version 1.0.0.5 +* Lite version released at Visual Studio Marketplace +* Exporting Unity asset from Visual Studio +* Unity package become package independent (Removed Newtonsoft.Json dependency) + +# Version 1.0.0 +* First release! +* Released on Unity Asset Store \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/CHANGELOG.TXT.meta b/Assets/Plugins/CodeAssist/CHANGELOG.TXT.meta new file mode 100644 index 00000000..1091f7ac --- /dev/null +++ b/Assets/Plugins/CodeAssist/CHANGELOG.TXT.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7c09026218d23254d97081497b9b9138 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor.meta b/Assets/Plugins/CodeAssist/Editor.meta new file mode 100644 index 00000000..547b9287 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 18c6bfa481e0be04285d889e7cdcc2b8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/AboutWindow.cs b/Assets/Plugins/CodeAssist/Editor/AboutWindow.cs new file mode 100644 index 00000000..8c7090f5 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/AboutWindow.cs @@ -0,0 +1,70 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEditor; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +#pragma warning restore IDE0005 + + +#nullable enable + + +namespace Meryel.UnityCodeAssist.Editor +{ + public class AboutWindow : EditorWindow + { + GUIStyle? styleLabel; + + public static void Display() + { + // Get existing open window or if none, make a new one: + var window = GetWindow(); + window.Show(); + + Serilog.Log.Debug("Displaying about window"); + + NetMQInitializer.Publisher?.SendAnalyticsEvent("Gui", "AboutWindow_Display"); + } + + private void OnEnable() + { + //**--icon + //var icon = AssetDatabase.LoadAssetAtPath("Assets/Sprites/Gear.png"); + //titleContent = new GUIContent("Code Assist", icon); + titleContent = new GUIContent("Code Assist About"); + } + + private void OnGUI() + { + styleLabel ??= new GUIStyle(GUI.skin.label) + { + wordWrap = true, + alignment = TextAnchor.MiddleLeft, + }; + + EditorGUILayout.LabelField($"Version number: {Assister.Version}", styleLabel, GUILayout.ExpandWidth(true)); + +#if MERYEL_UCA_LITE_VERSION + EditorGUILayout.LabelField($"License type: Lite", styleLabel, GUILayout.ExpandWidth(true)); +#else // MERYEL_UCA_LITE_VERSION + EditorGUILayout.LabelField($"License type: Full", styleLabel, GUILayout.ExpandWidth(true)); +#endif // MERYEL_UCA_LITE_VERSION + + if (GUILayout.Button("View changelog")) + { + Application.OpenURL("https://unitycodeassist.netlify.app/changelog"); + } + + if (GUILayout.Button("View third party notices")) + { + Application.OpenURL("https://unitycodeassist.netlify.app/thirdpartynotices"); + } + + } + } + +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/AboutWindow.cs.meta b/Assets/Plugins/CodeAssist/Editor/AboutWindow.cs.meta new file mode 100644 index 00000000..dc5142bd --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/AboutWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 78cb6c2143132274b81ce24df6a8efc0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/Assister.cs b/Assets/Plugins/CodeAssist/Editor/Assister.cs new file mode 100644 index 00000000..e338694d --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Assister.cs @@ -0,0 +1,268 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEditor; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +#pragma warning restore IDE0005 + + +#nullable enable + + +namespace Meryel.UnityCodeAssist.Editor +{ + public class Assister + { + public const string Version = "1.1.12"; + +#if MERYEL_UCA_LITE_VERSION + public const string Title = "Code Assist Lite"; +#else + public const string Title = "Code Assist"; +#endif + + [MenuItem("Tools/" + Title + "/Status", false, 1)] + static void DisplayStatusWindow() + { + StatusWindow.Display(); + } + + + [MenuItem("Tools/" + Title + "/Synchronize", false, 2)] + static void Sync() + { + EditorCoroutines.EditorCoroutineUtility.StartCoroutine(SyncAux(), NetMQInitializer.Publisher); + + //NetMQInitializer.Publisher.SendConnect(); + //Serilog.Log.Information("Code Assist is looking for more IDEs to connect to..."); + + NetMQInitializer.Publisher?.SendAnalyticsEvent("Gui", "Synchronize_MenuItem"); + } + + + [MenuItem("Tools/" + Title + "/Report error", false, 51)] + static void DisplayFeedbackWindow() + { + FeedbackWindow.Display(); + } + + [MenuItem("Tools/" + Title + "/About", false, 52)] + static void DisplayAboutWindow() + { + AboutWindow.Display(); + } + +#if MERYEL_UCA_LITE_VERSION + [MenuItem("Tools/" + Title + "/Compare versions", false, 31)] + static void CompareVersions() + { + Application.OpenURL("http://unitycodeassist.netlify.app/compare"); + + NetMQInitializer.Publisher?.SendAnalyticsEvent("Gui", "CompareVersions_MenuItem"); + } + + [MenuItem("Tools/" + Title + "/Get full version", false, 32)] + static void GetFullVersion() + { + Application.OpenURL("http://u3d.as/2N2H"); + + NetMQInitializer.Publisher?.SendAnalyticsEvent("Gui", "FullVersion_MenuItem"); + } +#endif // MERYEL_UCA_LITE_VERSION + + + static IEnumerator SyncAux() + { + var clientCount = NetMQInitializer.Publisher?.clients.Count ?? 0; + NetMQInitializer.Publisher?.SendConnect(); + Serilog.Log.Information("Code Assist is looking for more IDEs to connect to..."); + + //yield return new WaitForSeconds(3); + yield return new EditorCoroutines.EditorWaitForSeconds(3); + + var newClientCount = NetMQInitializer.Publisher?.clients.Count ?? 0; + + var dif = newClientCount - clientCount; + + if (dif <= 0) + Serilog.Log.Information("Code Assist couldn't find any new IDE to connect to."); + else + Serilog.Log.Information("Code Assist is connected to {Dif} new IDE(s).", dif); + } + +#if MERYEL_DEBUG + + [MenuItem("Code Assist/Binary2Text")] + static void Binary2Text() + { + var filePath = CommonTools.GetInputManagerFilePath(); + var hash = Input.UnityInputManager.GetMD5Hash(filePath); + var convertedPath = System.IO.Path.Combine(System.IO.Path.GetTempPath(), $"UCA_IM_{hash}.txt"); + + var b = new Input.Binary2TextExec(); + b.Exec(filePath, convertedPath, detailed: false, largeBinaryHashOnly: false, hexFloat: false); + } + + [MenuItem("Code Assist/Bump InputManager")] + static void BumpInputManager() + { + Input.InputManagerMonitor.Instance.Bump(); + } + + + [MenuItem("Code Assist/Layer Check")] + static void UpdateLayers() + { + var names = UnityEditorInternal.InternalEditorUtility.layers; + var indices = names.Select(l => LayerMask.NameToLayer(l).ToString()).ToArray(); + NetMQInitializer.Publisher?.SendLayers(indices, names); + + var sls = SortingLayer.layers; + var sortingNames = sls.Select(sl => sl.name).ToArray(); + var sortingIds = sls.Select(sl => sl.id.ToString()).ToArray(); + var sortingValues = sls.Select(sl => sl.value.ToString()).ToArray(); + + NetMQInitializer.Publisher?.SendSortingLayers(sortingNames, sortingIds, sortingValues); + + /* + for (var i = 0; i < 32; i++) + { + var name = LayerMask.LayerToName(i); + if (!string.IsNullOrEmpty(name)) + { + Debug.Log(i + ":" + name); + } + } + + if (ScriptFinder.FindGameObjectOfType("Deneme", out var go)) + NetMQInitializer.Publisher.SendGameObject(go); + */ + } + + [MenuItem("Code Assist/Tag Check")] + static void UpdateTags() + { + Serilog.Log.Debug("Listing tags {Count}", UnityEditorInternal.InternalEditorUtility.tags.Length); + + foreach (var tag in UnityEditorInternal.InternalEditorUtility.tags) + { + if (!string.IsNullOrEmpty(tag)) + { + Serilog.Log.Debug("{Tag}", tag); + } + } + + NetMQInitializer.Publisher?.SendTags(UnityEditorInternal.InternalEditorUtility.tags); + + } + + [MenuItem("Code Assist/GO Check")] + + static void TestGO() + { + + var go = GameObject.Find("Deneme"); + //var go = MonoBehaviour.FindObjectOfType().gameObject; + + NetMQInitializer.Publisher?.SendGameObject(go); + } + + [MenuItem("Code Assist/Undo Records Test")] + static void UndoTest() + { + var undos = new List(); + var redos = new List(); + + var type = typeof(Undo); + System.Reflection.MethodInfo dynMethod = type.GetMethod("GetRecords", + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static); + dynMethod.Invoke(null, new object[] { undos, redos }); + + Serilog.Log.Debug("undos:{UndoCount},redos:{RedoCount}", undos.Count, redos.Count); + + var last = undos.LastOrDefault(); + if (last != null) + { + Serilog.Log.Debug("last:{Last}", last); + Serilog.Log.Debug("group:{UndoCurrentGroup},{UndoCurrentGroupName}", + Undo.GetCurrentGroup(), Undo.GetCurrentGroupName()); + } + } + + + [MenuItem("Code Assist/Undo List Test")] + static void Undo2Test() + { + + //List undoList, out int undoCursor + var undoList = new List(); + int undoCursor = int.MaxValue; + var type = typeof(Undo); + System.Reflection.MethodInfo dynMethod = type.GetMethod("GetUndoList", + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static); + + dynMethod = type.GetMethod("GetUndoList", + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static, + null, + new System.Type[] { typeof(List), typeof(int).MakeByRefType() }, + null); + + + dynMethod.Invoke(null, new object[] { undoList, undoCursor }); + + Serilog.Log.Debug("undo count: {Count}", undoList.Count); + + } + + [MenuItem("Code Assist/Reload Domain")] + static void ReloadDomain() + { + EditorUtility.RequestScriptReload(); + + } + + + /* + [MenuItem("Code Assist/TEST")] + static void TEST() + { + //if (ScriptFinder.FindGameObjectOfType("Deneme_OtherScene", out var go)) + if (ScriptFinder.FindInstanceOfType("Deneme_SO", out var go, out var so)) + { + NetMQInitializer.Publisher.SendScriptableObject(so); + } + + ScriptFinder.DENEMEEEE(); + + + + } + */ + +#endif // MERYEL_DEBUG + + + public static void SendTagsAndLayers() + { + Serilog.Log.Debug(nameof(SendTagsAndLayers)); + + var tags = UnityEditorInternal.InternalEditorUtility.tags; + NetMQInitializer.Publisher?.SendTags(tags); + + var names = UnityEditorInternal.InternalEditorUtility.layers; + var indices = names.Select(l => LayerMask.NameToLayer(l).ToString()).ToArray(); + NetMQInitializer.Publisher?.SendLayers(indices, names); + + var sls = SortingLayer.layers; + var sortingNames = sls.Select(sl => sl.name).ToArray(); + var sortingIds = sls.Select(sl => sl.id.ToString()).ToArray(); + var sortingValues = sls.Select(sl => sl.value.ToString()).ToArray(); + NetMQInitializer.Publisher?.SendSortingLayers(sortingNames, sortingIds, sortingValues); + } + + } +} diff --git a/Assets/Plugins/CodeAssist/Editor/Assister.cs.meta b/Assets/Plugins/CodeAssist/Editor/Assister.cs.meta new file mode 100644 index 00000000..98bef0f1 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Assister.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b58d6110c18068b41b3e9804cebf0826 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/CodeAssistAssembly.asmdef b/Assets/Plugins/CodeAssist/Editor/CodeAssistAssembly.asmdef new file mode 100644 index 00000000..66c5157c --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/CodeAssistAssembly.asmdef @@ -0,0 +1,16 @@ +{ + "name": "Meryel.CodeAssist.Editor", + "rootNamespace": "", + "references": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": false, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/CodeAssistAssembly.asmdef.meta b/Assets/Plugins/CodeAssist/Editor/CodeAssistAssembly.asmdef.meta new file mode 100644 index 00000000..46cf3ea5 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/CodeAssistAssembly.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3795b7c096caf784fb4b03cf02b3b5d6 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/EditorCoroutines.meta b/Assets/Plugins/CodeAssist/Editor/EditorCoroutines.meta new file mode 100644 index 00000000..b0828cca --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/EditorCoroutines.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 250008fa072b8b74ab09618104489e0f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorCoroutine.cs b/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorCoroutine.cs new file mode 100644 index 00000000..adcb8f96 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorCoroutine.cs @@ -0,0 +1,157 @@ +/* + * Derived from Unity package + * https://docs.unity3d.com/Packages/com.unity.editorcoroutines@0.0/api/Unity.EditorCoroutines.Editor.html + */ + +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +//namespace Unity.EditorCoroutines.Editor +namespace Meryel.UnityCodeAssist.Editor.EditorCoroutines +{ + /// + /// A handle to an EditorCoroutine, can be passed to EditorCoroutineUtility methods to control lifetime. + /// + public class EditorCoroutine + { + private struct YieldProcessor + { + enum DataType : byte + { + None = 0, + WaitForSeconds = 1, + EditorCoroutine = 2, + AsyncOP = 3, + } + struct ProcessorData + { + public DataType type; + public double targetTime; + public object current; + } + + ProcessorData data; + + public void Set(object yield) + { + if (yield == data.current) + return; + + var type = yield.GetType(); + var dataType = DataType.None; + double targetTime = -1; + + if(type == typeof(EditorWaitForSeconds)) + { + targetTime = EditorApplication.timeSinceStartup + (yield as EditorWaitForSeconds).WaitTime; + dataType = DataType.WaitForSeconds; + } + else if(type == typeof(EditorCoroutine)) + { + dataType = DataType.EditorCoroutine; + } + else if(type == typeof(AsyncOperation) || type.IsSubclassOf(typeof(AsyncOperation))) + { + dataType = DataType.AsyncOP; + } + + data = new ProcessorData { current = yield, targetTime = targetTime, type = dataType }; + } + + public bool MoveNext(IEnumerator enumerator) + { + var advance = data.type switch + { + DataType.WaitForSeconds => data.targetTime <= EditorApplication.timeSinceStartup, + DataType.EditorCoroutine => (data.current as EditorCoroutine).m_IsDone, + DataType.AsyncOP => (data.current as AsyncOperation).isDone, + _ => data.current == enumerator.Current,//a IEnumerator or a plain object was passed to the implementation + }; + if (advance) + { + data = default;// (ProcessorData); + return enumerator.MoveNext(); + } + return true; + } + } + + internal WeakReference m_Owner; + IEnumerator m_Routine; + YieldProcessor m_Processor; + + bool m_IsDone; + + internal EditorCoroutine(IEnumerator routine) + { + m_Owner = null; + m_Routine = routine; + EditorApplication.update += MoveNext; + } + + internal EditorCoroutine(IEnumerator routine, object owner) + { + m_Processor = new YieldProcessor(); + m_Owner = new WeakReference(owner); + m_Routine = routine; + EditorApplication.update += MoveNext; + } + + internal void MoveNext() + { + if (m_Owner != null && !m_Owner.IsAlive) + { + EditorApplication.update -= MoveNext; + return; + } + + bool done = ProcessIEnumeratorRecursive(m_Routine); + m_IsDone = !done; + + if (m_IsDone) + EditorApplication.update -= MoveNext; + } + + static readonly Stack kIEnumeratorProcessingStack = new Stack(32); + private bool ProcessIEnumeratorRecursive(IEnumerator enumerator) + { + var root = enumerator; + while(enumerator.Current as IEnumerator != null) + { + kIEnumeratorProcessingStack.Push(enumerator); + enumerator = enumerator.Current as IEnumerator; + } + + //process leaf + m_Processor.Set(enumerator.Current); + var result = m_Processor.MoveNext(enumerator); + + while (kIEnumeratorProcessingStack.Count > 1) + { + if (!result) + { + result = kIEnumeratorProcessingStack.Pop().MoveNext(); + } + else + kIEnumeratorProcessingStack.Clear(); + } + + if (kIEnumeratorProcessingStack.Count > 0 && !result && root == kIEnumeratorProcessingStack.Pop()) + { + result = root.MoveNext(); + } + + return result; + } + + internal void Stop() + { + m_Owner = null; + m_Routine = null; + EditorApplication.update -= MoveNext; + } + } +} diff --git a/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorCoroutine.cs.meta b/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorCoroutine.cs.meta new file mode 100644 index 00000000..6ef3bebd --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorCoroutine.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a1f2364c577188f44ad5d335b39795b3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorCoroutineUtility.cs b/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorCoroutineUtility.cs new file mode 100644 index 00000000..a72c8545 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorCoroutineUtility.cs @@ -0,0 +1,128 @@ +/* + * Derived from Unity package + * https://docs.unity3d.com/Packages/com.unity.editorcoroutines@0.0/api/Unity.EditorCoroutines.Editor.html + */ + +using System.Collections; +using UnityEngine; + +//namespace Unity.EditorCoroutines.Editor +namespace Meryel.UnityCodeAssist.Editor.EditorCoroutines +{ + public static class EditorCoroutineUtility + { + /// + /// Starts an EditorCoroutine with the specified owner object. + /// If the garbage collector collects the owner object, while the resulting coroutine is still executing, the coroutine will stop running. + /// + /// using System.Collections; + /// using Unity.EditorCoroutines.Editor; + /// using UnityEditor; + /// + /// public class ExampleWindow : EditorWindow + /// { + /// int m_Updates = 0; + /// void OnEnable() + /// { + /// EditorCoroutineUtility.StartCoroutine(CountEditorUpdates(), this); + /// } + /// + /// IEnumerator CountEditorUpdates() + /// { + /// while (true) + /// { + /// ++m_Updates; + /// yield return null; + /// } + /// } + /// } + /// + /// + /// IEnumerator to iterate over. + /// Object owning the coroutine. + /// + /// Only types that don't inherit from UnityEngine.Object will get collected the next time the GC runs instead of getting null-ed immediately. + /// + /// A handle to an EditorCoroutine. + public static EditorCoroutine StartCoroutine(IEnumerator routine, object owner) + { + return new EditorCoroutine(routine, owner); + } + + /// + /// This method starts an EditorCoroutine without an owning object. The EditorCoroutine runs until it completes or is canceled using StopCoroutine. + /// + /// using System.Collections; + /// using Unity.EditorCoroutines.Editor; + /// using UnityEditor; + /// using UnityEngine; + /// + /// public class ExampleWindow : EditorWindow + /// { + /// void OnEnable() + /// { + /// EditorCoroutineUtility.StartCoroutineOwnerless(LogTimeSinceStartup()); + /// } + /// + /// IEnumerator LogTimeSinceStartup() + /// { + /// while (true) + /// { + /// Debug.LogFormat("Time since startup: {0} s", Time.realtimeSinceStartup); + /// yield return null; + /// } + /// } + /// } + /// + /// + /// Generator function to execute. + /// A handle to an EditorCoroutine. + public static EditorCoroutine StartCoroutineOwnerless(IEnumerator routine) + { + return new EditorCoroutine(routine); + } + + /// + /// Immediately stop an EditorCoroutine. This method is safe to call on an already completed EditorCoroutine. + /// + /// using System.Collections; + /// using Unity.EditorCoroutines.Editor; + /// using UnityEditor; + /// using UnityEngine; + /// + /// public class ExampleWindow : EditorWindow + /// { + /// EditorCoroutine m_LoggerCoroutine; + /// void OnEnable() + /// { + /// m_LoggerCoroutine = EditorCoroutineUtility.StartCoroutineOwnerless(LogRunning()); + /// } + /// + /// void OnDisable() + /// { + /// EditorCoroutineUtility.StopCoroutine(m_LoggerCoroutine); + /// } + /// + /// IEnumerator LogRunning() + /// { + /// while (true) + /// { + /// Debug.Log("Running"); + /// yield return null; + /// } + /// } + /// } + /// + /// + /// A handle to an EditorCoroutine. + public static void StopCoroutine(EditorCoroutine coroutine) + { + if (coroutine == null) + { + Debug.LogAssertion("EditorCoroutine handle is null."); + return; + } + coroutine.Stop(); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorCoroutineUtility.cs.meta b/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorCoroutineUtility.cs.meta new file mode 100644 index 00000000..69228022 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorCoroutineUtility.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 23bbd9ca149e8964fbe7fa9052de1738 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorWaitForSeconds.cs b/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorWaitForSeconds.cs new file mode 100644 index 00000000..347c7f5d --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorWaitForSeconds.cs @@ -0,0 +1,49 @@ +/* + * Derived from Unity package + * https://docs.unity3d.com/Packages/com.unity.editorcoroutines@0.0/api/Unity.EditorCoroutines.Editor.html + */ + +//namespace Unity.EditorCoroutines.Editor +namespace Meryel.UnityCodeAssist.Editor.EditorCoroutines +{ + /// + /// Suspends the EditorCoroutine execution for the given amount of seconds, using unscaled time. + /// The coroutine execution continues after the specified time has elapsed. + /// + /// using System.Collections; + /// using UnityEngine; + /// using Unity.EditorCoroutines.Editor; + /// using UnityEditor; + /// + /// public class MyEditorWindow : EditorWindow + /// { + /// IEnumerator PrintEachSecond() + /// { + /// var waitForOneSecond = new EditorWaitForSeconds(1.0f); + /// + /// while (true) + /// { + /// yield return waitForOneSecond; + /// Debug.Log("Printing each second"); + /// } + /// } + /// } + /// + /// + public class EditorWaitForSeconds + { + /// + /// The time to wait in seconds. + /// + public float WaitTime { get; } + + /// + /// Creates a instruction object for yielding inside a generator function. + /// + /// The amount of time to wait in seconds. + public EditorWaitForSeconds(float time) + { + WaitTime = time; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorWaitForSeconds.cs.meta b/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorWaitForSeconds.cs.meta new file mode 100644 index 00000000..c7744050 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorWaitForSeconds.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 07f1a73f468886b498084e6743369152 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorWindowCoroutineExtension.cs b/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorWindowCoroutineExtension.cs new file mode 100644 index 00000000..f1fa47c3 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorWindowCoroutineExtension.cs @@ -0,0 +1,109 @@ +/* + * Derived from Unity package + * https://docs.unity3d.com/Packages/com.unity.editorcoroutines@0.0/api/Unity.EditorCoroutines.Editor.html + */ + +using System.Collections; +using UnityEditor; +using UnityEngine; + +//namespace Unity.EditorCoroutines.Editor +namespace Meryel.UnityCodeAssist.Editor.EditorCoroutines +{ + public static class EditorWindowCoroutineExtension + { + /// + /// Start an EditorCoroutine, owned by the calling EditorWindow instance. + /// + /// using System.Collections; + /// using Unity.EditorCoroutines.Editor; + /// using UnityEditor; + /// + /// public class ExampleWindow : EditorWindow + /// { + /// void OnEnable() + /// { + /// this.StartCoroutine(CloseWindowDelayed()); + /// } + /// + /// IEnumerator CloseWindowDelayed() //close the window after 1000 frames have elapsed + /// { + /// int count = 1000; + /// while (count > 0) + /// { + /// yield return null; + /// } + /// Close(); + /// } + /// } + /// + /// + /// + /// + public static EditorCoroutine StartCoroutine(this EditorWindow window, IEnumerator routine) + { + return new EditorCoroutine(routine, window); + } + + /// + /// Immediately stop an EditorCoroutine that was started by the calling instance. This method is safe to call on an already completed EditorCoroutine. + /// + /// using System.Collections; + /// using Unity.EditorCoroutines.Editor; + /// using UnityEditor; + /// using UnityEngine; + /// + /// public class ExampleWindow : EditorWindow + /// { + /// EditorCoroutine coroutine; + /// void OnEnable() + /// { + /// coroutine = this.StartCoroutine(CloseWindowDelayed()); + /// } + /// + /// private void OnDisable() + /// { + /// this.StopCoroutine(coroutine); + /// } + /// + /// IEnumerator CloseWindowDelayed() + /// { + /// while (true) + /// { + /// Debug.Log("Running"); + /// yield return null; + /// } + /// } + /// } + /// + /// + /// + public static void StopCoroutine(this EditorWindow window, EditorCoroutine coroutine) + { + if(coroutine == null) + { + Debug.LogAssertion("Provided EditorCoroutine handle is null."); + return; + } + + if(coroutine.m_Owner == null) + { + Debug.LogError("The EditorCoroutine is ownerless. Please use EditorCoroutineEditor.StopCoroutine to terminate such coroutines."); + return; + } + + if (!coroutine.m_Owner.IsAlive) + return; //The EditorCoroutine's owner was already terminated execution will cease next time it is processed + + var owner = coroutine.m_Owner.Target as EditorWindow; + + if (owner == null || owner != null && owner != window) + { + Debug.LogErrorFormat("The EditorCoroutine is owned by another object: {0}.", coroutine.m_Owner.Target); + return; + } + + EditorCoroutineUtility.StopCoroutine(coroutine); + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorWindowCoroutineExtension.cs.meta b/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorWindowCoroutineExtension.cs.meta new file mode 100644 index 00000000..3da4899e --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/EditorCoroutines/EditorWindowCoroutineExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3587f75f326179340b8e8ab910b46981 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences.meta b/Assets/Plugins/CodeAssist/Editor/ExternalReferences.meta new file mode 100644 index 00000000..a1fd9259 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 493c52d9efeda8342916a68ba32afaca +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.AsyncIO.deps.json b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.AsyncIO.deps.json new file mode 100644 index 00000000..14cde8ed --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.AsyncIO.deps.json @@ -0,0 +1,56 @@ +{ + "runtimeTarget": { + "name": ".NETStandard,Version=v2.0/", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETStandard,Version=v2.0": {}, + ".NETStandard,Version=v2.0/": { + "Meryel.UnityCodeAssist.AsyncIO/0.1.69.0": { + "dependencies": { + "NETStandard.Library": "2.0.3", + "SourceLink.Create.CommandLine": "2.7.3" + }, + "runtime": { + "Meryel.UnityCodeAssist.AsyncIO.dll": {} + } + }, + "Microsoft.NETCore.Platforms/1.1.0": {}, + "NETStandard.Library/2.0.3": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "SourceLink.Create.CommandLine/2.7.3": {} + } + }, + "libraries": { + "Meryel.UnityCodeAssist.AsyncIO/0.1.69.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Microsoft.NETCore.Platforms/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", + "path": "microsoft.netcore.platforms/1.1.0", + "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" + }, + "NETStandard.Library/2.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "path": "netstandard.library/2.0.3", + "hashPath": "netstandard.library.2.0.3.nupkg.sha512" + }, + "SourceLink.Create.CommandLine/2.7.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-1U6q0Z0ot1JZhnzuzAlk+WTKBhfaqI/a00AACmUuf+/iwlxseix3mMUsz+CzdUh/T7mtaqfWC8FjrnHaFnxxRg==", + "path": "sourcelink.create.commandline/2.7.3", + "hashPath": "sourcelink.create.commandline.2.7.3.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.AsyncIO.deps.json.meta b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.AsyncIO.deps.json.meta new file mode 100644 index 00000000..55c38b96 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.AsyncIO.deps.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5e374aa427b2d7744ab94b20c02047bf +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.AsyncIO.dll b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.AsyncIO.dll new file mode 100644 index 0000000000000000000000000000000000000000..fbe721ece49c0287b61bb9550dabdef6bd068aec GIT binary patch literal 31744 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 Aga7~l literal 0 HcmV?d00001 diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.AsyncIO.dll.meta b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.AsyncIO.dll.meta new file mode 100644 index 00000000..51c2e5d9 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.AsyncIO.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 87d82e8a05f47e84ea007ad27fff24aa +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.deps.json b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.deps.json new file mode 100644 index 00000000..ace0127f --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.deps.json @@ -0,0 +1,113 @@ +{ + "runtimeTarget": { + "name": ".NETStandard,Version=v2.0/", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETStandard,Version=v2.0": {}, + ".NETStandard,Version=v2.0/": { + "Meryel.UnityCodeAssist.NaCl/1.0.0": { + "dependencies": { + "NETStandard.Library": "2.0.3", + "System.Memory": "4.5.3" + }, + "runtime": { + "Meryel.UnityCodeAssist.NaCl.dll": {} + } + }, + "Microsoft.NETCore.Platforms/1.1.0": {}, + "NETStandard.Library/2.0.3": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "System.Buffers/4.4.0": { + "runtime": { + "lib/netstandard2.0/System.Buffers.dll": { + "assemblyVersion": "4.0.2.0", + "fileVersion": "4.6.25519.3" + } + } + }, + "System.Memory/4.5.3": { + "dependencies": { + "System.Buffers": "4.4.0", + "System.Numerics.Vectors": "4.4.0", + "System.Runtime.CompilerServices.Unsafe": "4.5.2" + }, + "runtime": { + "lib/netstandard2.0/System.Memory.dll": { + "assemblyVersion": "4.0.1.1", + "fileVersion": "4.6.27617.2" + } + } + }, + "System.Numerics.Vectors/4.4.0": { + "runtime": { + "lib/netstandard2.0/System.Numerics.Vectors.dll": { + "assemblyVersion": "4.1.3.0", + "fileVersion": "4.6.25519.3" + } + } + }, + "System.Runtime.CompilerServices.Unsafe/4.5.2": { + "runtime": { + "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": { + "assemblyVersion": "4.0.4.1", + "fileVersion": "4.6.26919.2" + } + } + } + } + }, + "libraries": { + "Meryel.UnityCodeAssist.NaCl/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Microsoft.NETCore.Platforms/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", + "path": "microsoft.netcore.platforms/1.1.0", + "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" + }, + "NETStandard.Library/2.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "path": "netstandard.library/2.0.3", + "hashPath": "netstandard.library.2.0.3.nupkg.sha512" + }, + "System.Buffers/4.4.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-AwarXzzoDwX6BgrhjoJsk6tUezZEozOT5Y9QKF94Gl4JK91I4PIIBkBco9068Y9/Dra8Dkbie99kXB8+1BaYKw==", + "path": "system.buffers/4.4.0", + "hashPath": "system.buffers.4.4.0.nupkg.sha512" + }, + "System.Memory/4.5.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA==", + "path": "system.memory/4.5.3", + "hashPath": "system.memory.4.5.3.nupkg.sha512" + }, + "System.Numerics.Vectors/4.4.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UiLzLW+Lw6HLed1Hcg+8jSRttrbuXv7DANVj0DkL9g6EnnzbL75EB7EWsw5uRbhxd/4YdG8li5XizGWepmG3PQ==", + "path": "system.numerics.vectors/4.4.0", + "hashPath": "system.numerics.vectors.4.4.0.nupkg.sha512" + }, + "System.Runtime.CompilerServices.Unsafe/4.5.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-wprSFgext8cwqymChhrBLu62LMg/1u92bU+VOwyfBimSPVFXtsNqEWC92Pf9ofzJFlk4IHmJA75EDJn1b2goAQ==", + "path": "system.runtime.compilerservices.unsafe/4.5.2", + "hashPath": "system.runtime.compilerservices.unsafe.4.5.2.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.deps.json.meta b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.deps.json.meta new file mode 100644 index 00000000..c28518e5 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.deps.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9120d734535c3394ca1a119f7817ec7b +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.dll b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.dll new file mode 100644 index 0000000000000000000000000000000000000000..3f0dcdc39c3bfc9106767e9a80d05ffa1bdb7fc1 GIT binary patch literal 30720 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 literal 0 HcmV?d00001 diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.dll.meta b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.dll.meta new file mode 100644 index 00000000..2dba504f --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 6515aacfaa0543c498e45f35b6cefc83 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.xml b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.xml new file mode 100644 index 00000000..c411f8dd --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.xml @@ -0,0 +1,517 @@ + + + + Meryel.UnityCodeAssist.NaCl + + + + + NaCl.net provides an API to multiply a point on the Curve25519 curve. + This can be used as a building block to construct key exchange mechanisms, or more generally to compute a public key from a secret key. + + + + + Length of a scalar on curve. + + + 32 bytes length. + + + + + This function can be used to compute a shared secret q given a user's secret key and another user's public key. + + Resulted shared secret + Secret key of alice + Public key of bob + + + + This function can be used to compute a shared secret q given a user's secret key and another user's public key. + + Secret key of alice + Public key of bob + Shared key + + + + This function can be used to compute a shared secret q given a user's secret key and another user's public key. + + Secret key of alice + Public key of bob + Shared key + + + + This function can be used to compute a shared secret q given a user's secret key and another user's public key. + + Resulted shared secret + Secret key of alice + Public key of bob + + + + This function can be used to compute a shared secret q given a user's secret key and another user's public key. + + Resulted shared secret + Shared key offset to start write to + Secret key of alice + Secret key offset to start read from + Public key of bob + Public key offset, to start read from + + + + Given a user's secret key n ( length), the ScalarMultiplicationBase function computes the user's public key and puts it into q. + + Public key, result of the multiplication + Secret key, which will be multiplied with base + + + + Given a user's secret key n ( length), the ScalarMultiplicationBase function computes the user's public key and puts it into q. + + Public key, result of the multiplication + Secret key, which will be multiplied with base + + + + Given a user's secret key n ( length), the ScalarMultiplicationBase function computes the user's public key and puts it into q. + + Public key, result of the multiplication + Public key offset to start write the in + Secret key, which will be multiplied with base + Secret key offset, to start read from + + + + Given a user's secret key n ( length), the ScalarMultiplicationBase function computes the user's public key and puts it into q. + + Secret key, which will be multiplied with base + Returns q, the public key + + + + Given a user's secret key n ( length), the ScalarMultiplicationBase function computes the user's public key and puts it into q. + + Secret key, which will be multiplied with base + Returns q, the public key + + + + Public-key authenticated encryption. + + + + Using public-key authenticated encryption, Bob can encrypt a confidential message specifically for Alice, + using Alice's public key. + Using Bob's public key, Alice can compute a shared secret key. Using Alice's public key and his secret key, + Bob can compute the exact same shared secret key. + That shared secret key can be used to verify that the encrypted message was not tampered with, + before eventually decrypting it. + Alice only needs Bob's public key, the nonce and the ciphertext. Bob should never ever share his secret key, + even with Alice. + And in order to send messages to Alice, Bob only needs Alice's public key. + Alice should never ever share her secret key either, even with Bob. + Alice can reply to Bob using the same system, without having to generate a distinct key pair. + The nonce doesn't have to be confidential, but it should be used with just one invocation of + Curve25519XSalsa20Poly1305.Encrypt + for a particular pair of public and secret keys. + One easy way to generate a nonce is to use , + considering the size of the nonces the risk of any random collisions is negligible. + For some applications, if you wish to use nonces to detect missing messages or to ignore replayed messages, + it is also acceptable to use a simple incrementing counter as a nonce. + When doing so you must ensure that the same value can never be re-used + (for example you may have multiple threads or even hosts generating messages using the same key pairs). + As stated above, senders can decrypt their own messages, and compute a valid authentication tag for any + messages encrypted with a given shared secret key. This is generally not an issue for online protocols. + If this is not acceptable, check out the Sealed Boxes section, + as well as the Key Exchange section in this documentation. + + + + + Length of the secret key, 32. + + + + + Length of the public key, 32. + + + + + Create a new Curve25519XSalsa20Poly1305 and pre-calculate the shared secret from secret and public key. + + SecretKey + PublicKey + + + + Randomly generates a secret key and a corresponding public key. + + Buffer the secret key will be written to. + Buffer the public key will be written to. + thrown if secretKey or publicKey are not 32 bytes long + + + + Randomly generates a secret key and a corresponding public key. + + Buffer the secret key will be written to. + Buffer the public key will be written to. + thrown if secretKey or publicKey are not 32 bytes long + + + + Randomly generates a secret key and a corresponding public key. + + Generated secret-key. + Corresponding public key + + + + Randomly generates a secret key and a corresponding public key. + + Returns a pair of secret-key and public-key + + + + One-time authentication using Poly1305. + + + Poly1305 takes a 32-byte, one-time key and a message and produces a 16-byte tag that authenticates + the message such that an attacker has a negligible chance of producing a valid tag for a + inauthentic message. + + + + + The length of the key, 32 bytes. + + + + + The length of the produced tag, 16 bytes. + + + + + Create a new Poly1305 object with the specified key. + + The key + + + + Create a new Poly1305, key must be using + SetKey + + before calling + Update + + + + + + Dispose the object and clear any sensitive buffers. + + + + + Reset the object to the initial state. + + + + + Set a new key + + Key + + + + Set a new key + + The key + The key offset + + + + Complete the authentication and produce the tag. + + The will be written to the parameter. + + + + Update the authentication with more bytes. + + Bytes + + + + Update the authentication with more bytes. + + Bytes + Offset to write bytes from + Number of bytes to write + + + + Complete the authentication and produce the tag. + + The authentication tag + + + + Compute the tag of the input and verify with provided tag. + + The provided tag. + The input to compute tag for. + True if the tag match the input, otherwise false + + + + Compute the tag of the input and verify with provided tag. + + The provided tag. + The offset to start read the tag from + The input to compute tag for. + The offset to start read input from + The amount of bytes to read from the input + True if the tag match the input, otherwise false + + + + XSalsa20 is a stream cipher based upon Salsa20 but with a much longer nonce: 192 bits instead of 64 bits. + + + XSalsa20 uses a 256-bit key as well as the first 128 bits of the nonce in order to compute a subkey. + This subkey, as well as the remaining 64 bits of the nonce, are the parameters of the Salsa20 function + used to actually generate the stream. + + + Like Salsa20, XSalsa20 is immune to timing attacks and provides its own 64-bit block counter to avoid + incrementing the nonce after each block. + + + But with XSalsa20's longer nonce, it is safe to generate nonces using + for every message encrypted with the same key without having to + worry about a collision. + + + + + + The key length, 32 bytes. + + + + + The nonce length, 24 bytes. + + + + + Create a new XSalsa object with the specified key + + The key + Thrown if key length is not 32 bytes + + + + Create a new XSalsa object with the specified key + + The key + Thrown if key length is not 32 bytes + + + + Dispose the object and clear any sensitive data. + + + + + Transform a message using a nonce and a secret key. + + Output will be written to the parameter. + Input to transform + Nonce + + + + Transform a message using a nonce and a secret key. + + Output will be written to the parameter. + Offset to start write to + Input to transform + Offset to start read from + Amount of bytes to read + Nonce + Nonce offset + + + + Encrypts a message with a key and a nonce to keep it confidential and + Computes an authentication tag. This tag is used to make sure that the message + hasn't been tampered with before decrypting it. + + + + A single key is used both to encrypt/authenticate and verify/decrypt messages. + For this reason, it is critical to keep the key confidential. + + + The nonce doesn't have to be confidential, but it should never ever be reused with the same key. + The easiest way to generate a nonce is to use . + + + Messages encrypted are assumed to be independent. + If multiple messages are sent using this API and random nonces, + there will be no way to detect if a message has been received twice, + or if messages have been reordered. + + + + + + Key length, 32 bytes. + + + + + Tag length, 16 bytes. + + + + + Nonce length, 24 bytes. + + + + + Create a new object with the specified shared key + + Shared key + Thrown if key is not 32 bytes long + + + + Create a new object with the specified shared key + + Shared key + Thrown if key is not 32 bytes long + + + + Encrypts a message, with the object key and a nonce n. + + + Detached mode, some applications may need to store the authentication tag and + the encrypted message at different locations. + + + + + + + + + Encrypts a message, with the object key and a nonce n. + + + Detached mode, some applications may need to store the authentication tag and + the encrypted message at different locations. + + + + + Encrypts a message, with the object key and a nonce n. + + + Combined mode, the authentication tag and the encrypted message are stored together. + This is usually what you want. + + Encrypted text will be written to the buffer + Message to encrypt + The nonce + + + + Encrypts a message, with the object key and a nonce n. + + + Combined mode, the authentication tag and the encrypted message are stored together. + This is usually what you want. + + Encrypted text will be written to the buffer + Offset to start write the cipher text to + Message to encrypt + Offset to start read message from + Number of bytes to read from message + The nonce + Nonce offset + + + + Verifies and decrypts a ciphertext produced by + Encrypt + + + + Detached mode, some applications may need to store the authentication tag and + the encrypted message at different locations. + + True if successfully verified and decrypted ciphertext. + + + + Verifies and decrypts a ciphertext produced by + Encrypt + + + + Detached mode, some applications may need to store the authentication tag and + the encrypted message at different locations. + + + + + Verifies and decrypts a ciphertext produced by + Encrypt + + + + Combined mode, the authentication tag and the encrypted message are stored together. + This is usually what you want. + + + + + True if successfully verified and decrypted ciphertext. + + + + Verifies and decrypts a ciphertext produced by + Encrypt + + + + Combined mode, the authentication tag and the encrypted message are stored together. + This is usually what you want. + + + + + + + + + True if successfully verified and decrypted ciphertext. + + + + Dispose the object and clear any sensitive information + + + + diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.xml.meta b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.xml.meta new file mode 100644 index 00000000..efc17a4c --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NaCl.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d8ad62f6c49da21408025711f440e677 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NetMQ.deps.json b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NetMQ.deps.json new file mode 100644 index 00000000..f7a8f5e1 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NetMQ.deps.json @@ -0,0 +1,472 @@ +{ + "runtimeTarget": { + "name": ".NETStandard,Version=v2.0/", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETStandard,Version=v2.0": {}, + ".NETStandard,Version=v2.0/": { + "Meryel.UnityCodeAssist.NetMQ/4.0.0.0": { + "dependencies": { + "AsyncIO": "0.1.69", + "JetBrains.Annotations": "2022.3.1", + "Microsoft.SourceLink.GitHub": "1.1.1", + "NETStandard.Library": "2.0.3", + "NaCl.Net": "0.1.0", + "System.ServiceModel.Primitives": "4.9.0", + "System.Threading.Tasks.Extensions": "4.5.4", + "System.ValueTuple": "4.5.0" + }, + "runtime": { + "Meryel.UnityCodeAssist.NetMQ.dll": {} + } + }, + "JetBrains.Annotations/2022.3.1": { + "runtime": { + "lib/netstandard2.0/JetBrains.Annotations.dll": { + "assemblyVersion": "4242.42.42.42", + "fileVersion": "2022.3.1.0" + } + } + }, + "Microsoft.Bcl.AsyncInterfaces/5.0.0": { + "dependencies": { + "System.Threading.Tasks.Extensions": "4.5.4" + }, + "runtime": { + "lib/netstandard2.0/Microsoft.Bcl.AsyncInterfaces.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.20.51904" + } + } + }, + "Microsoft.Build.Tasks.Git/1.1.1": {}, + "Microsoft.Extensions.ObjectPool/5.0.10": { + "runtime": { + "lib/netstandard2.0/Microsoft.Extensions.ObjectPool.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.1021.41022" + } + } + }, + "Microsoft.NETCore.Platforms/1.1.0": {}, + "Microsoft.SourceLink.Common/1.1.1": {}, + "Microsoft.SourceLink.GitHub/1.1.1": { + "dependencies": { + "Microsoft.Build.Tasks.Git": "1.1.1", + "Microsoft.SourceLink.Common": "1.1.1" + } + }, + "NETStandard.Library/2.0.3": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "System.Buffers/4.5.1": { + "runtime": { + "lib/netstandard2.0/System.Buffers.dll": { + "assemblyVersion": "4.0.3.0", + "fileVersion": "4.6.28619.1" + } + } + }, + "System.Formats.Asn1/5.0.0": { + "dependencies": { + "System.Buffers": "4.5.1", + "System.Memory": "4.5.4" + }, + "runtime": { + "lib/netstandard2.0/System.Formats.Asn1.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.20.51904" + } + } + }, + "System.Memory/4.5.4": { + "dependencies": { + "System.Buffers": "4.5.1", + "System.Numerics.Vectors": "4.5.0", + "System.Runtime.CompilerServices.Unsafe": "4.5.3" + }, + "runtime": { + "lib/netstandard2.0/System.Memory.dll": { + "assemblyVersion": "4.0.1.1", + "fileVersion": "4.6.28619.1" + } + } + }, + "System.Numerics.Vectors/4.5.0": { + "runtime": { + "lib/netstandard2.0/System.Numerics.Vectors.dll": { + "assemblyVersion": "4.1.4.0", + "fileVersion": "4.6.26515.6" + } + } + }, + "System.Private.ServiceModel/4.9.0": { + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "5.0.0", + "Microsoft.Extensions.ObjectPool": "5.0.10", + "System.Numerics.Vectors": "4.5.0", + "System.Reflection.DispatchProxy": "4.7.1", + "System.Security.Cryptography.Xml": "5.0.0", + "System.Security.Principal.Windows": "5.0.0" + }, + "runtime": { + "lib/netstandard2.0/System.Private.ServiceModel.dll": { + "assemblyVersion": "4.9.0.0", + "fileVersion": "4.900.21.52002" + } + }, + "resources": { + "lib/netstandard2.0/cs/System.Private.ServiceModel.resources.dll": { + "locale": "cs" + }, + "lib/netstandard2.0/de/System.Private.ServiceModel.resources.dll": { + "locale": "de" + }, + "lib/netstandard2.0/es/System.Private.ServiceModel.resources.dll": { + "locale": "es" + }, + "lib/netstandard2.0/fr/System.Private.ServiceModel.resources.dll": { + "locale": "fr" + }, + "lib/netstandard2.0/it/System.Private.ServiceModel.resources.dll": { + "locale": "it" + }, + "lib/netstandard2.0/ja/System.Private.ServiceModel.resources.dll": { + "locale": "ja" + }, + "lib/netstandard2.0/ko/System.Private.ServiceModel.resources.dll": { + "locale": "ko" + }, + "lib/netstandard2.0/pl/System.Private.ServiceModel.resources.dll": { + "locale": "pl" + }, + "lib/netstandard2.0/pt-BR/System.Private.ServiceModel.resources.dll": { + "locale": "pt-BR" + }, + "lib/netstandard2.0/ru/System.Private.ServiceModel.resources.dll": { + "locale": "ru" + }, + "lib/netstandard2.0/tr/System.Private.ServiceModel.resources.dll": { + "locale": "tr" + }, + "lib/netstandard2.0/zh-Hans/System.Private.ServiceModel.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netstandard2.0/zh-Hant/System.Private.ServiceModel.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "System.Reflection.DispatchProxy/4.7.1": { + "runtime": { + "lib/netstandard2.0/System.Reflection.DispatchProxy.dll": { + "assemblyVersion": "4.0.6.0", + "fileVersion": "4.700.20.21406" + } + } + }, + "System.Runtime.CompilerServices.Unsafe/4.5.3": { + "runtime": { + "lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll": { + "assemblyVersion": "4.0.4.1", + "fileVersion": "4.6.28619.1" + } + } + }, + "System.Security.AccessControl/5.0.0": { + "dependencies": { + "System.Security.Principal.Windows": "5.0.0" + }, + "runtime": { + "lib/netstandard2.0/System.Security.AccessControl.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.20.51904" + } + } + }, + "System.Security.Cryptography.Cng/5.0.0": { + "runtime": { + "lib/netstandard2.0/System.Security.Cryptography.Cng.dll": { + "assemblyVersion": "4.3.0.0", + "fileVersion": "4.700.19.51609" + } + } + }, + "System.Security.Cryptography.Pkcs/5.0.0": { + "dependencies": { + "System.Buffers": "4.5.1", + "System.Formats.Asn1": "5.0.0", + "System.Memory": "4.5.4", + "System.Security.Cryptography.Cng": "5.0.0" + }, + "runtime": { + "lib/netstandard2.0/System.Security.Cryptography.Pkcs.dll": { + "assemblyVersion": "4.0.4.0", + "fileVersion": "5.0.20.51904" + } + } + }, + "System.Security.Cryptography.Xml/5.0.0": { + "dependencies": { + "System.Memory": "4.5.4", + "System.Security.Cryptography.Pkcs": "5.0.0", + "System.Security.Permissions": "5.0.0" + }, + "runtime": { + "lib/netstandard2.0/System.Security.Cryptography.Xml.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.20.51904" + } + } + }, + "System.Security.Permissions/5.0.0": { + "dependencies": { + "System.Security.AccessControl": "5.0.0" + }, + "runtime": { + "lib/netstandard2.0/System.Security.Permissions.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.20.51904" + } + } + }, + "System.Security.Principal.Windows/5.0.0": { + "runtime": { + "lib/netstandard2.0/System.Security.Principal.Windows.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.20.51904" + } + } + }, + "System.ServiceModel.Primitives/4.9.0": { + "dependencies": { + "System.Private.ServiceModel": "4.9.0" + }, + "runtime": { + "lib/netstandard2.0/System.ServiceModel.Primitives.dll": { + "assemblyVersion": "4.9.0.0", + "fileVersion": "4.900.21.52002" + }, + "lib/netstandard2.0/System.ServiceModel.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.900.21.52002" + } + } + }, + "System.Threading.Tasks.Extensions/4.5.4": { + "dependencies": { + "System.Runtime.CompilerServices.Unsafe": "4.5.3" + }, + "runtime": { + "lib/netstandard2.0/System.Threading.Tasks.Extensions.dll": { + "assemblyVersion": "4.2.0.1", + "fileVersion": "4.6.28619.1" + } + } + }, + "System.ValueTuple/4.5.0": {}, + "AsyncIO/0.1.69": { + "runtime": { + "Meryel.UnityCodeAssist.AsyncIO.dll": {} + } + }, + "NaCl.Net/0.1.0": { + "dependencies": { + "System.Memory": "4.5.4" + }, + "runtime": { + "Meryel.UnityCodeAssist.NaCl.dll": {} + } + } + } + }, + "libraries": { + "Meryel.UnityCodeAssist.NetMQ/4.0.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "JetBrains.Annotations/2022.3.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-11nsS3+lFICGkztVs9PP2NRItxf9fF+qD6xEW/T0YGto52zj07wseUeBdMAU1ah9HNVTDZyRC1u4NWdtJScwhw==", + "path": "jetbrains.annotations/2022.3.1", + "hashPath": "jetbrains.annotations.2022.3.1.nupkg.sha512" + }, + "Microsoft.Bcl.AsyncInterfaces/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-W8DPQjkMScOMTtJbPwmPyj9c3zYSFGawDW3jwlBOOsnY+EzZFLgNQ/UMkK35JmkNOVPdCyPr2Tw7Vv9N+KA3ZQ==", + "path": "microsoft.bcl.asyncinterfaces/5.0.0", + "hashPath": "microsoft.bcl.asyncinterfaces.5.0.0.nupkg.sha512" + }, + "Microsoft.Build.Tasks.Git/1.1.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q==", + "path": "microsoft.build.tasks.git/1.1.1", + "hashPath": "microsoft.build.tasks.git.1.1.1.nupkg.sha512" + }, + "Microsoft.Extensions.ObjectPool/5.0.10": { + "type": "package", + "serviceable": true, + "sha512": "sha512-pp9tbGqIhdEXL6Q1yJl+zevAJSq4BsxqhS1GXzBvEsEz9DDNu9GLNzgUy2xyFc4YjB4m4Ff2YEWTnvQvVYdkvQ==", + "path": "microsoft.extensions.objectpool/5.0.10", + "hashPath": "microsoft.extensions.objectpool.5.0.10.nupkg.sha512" + }, + "Microsoft.NETCore.Platforms/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", + "path": "microsoft.netcore.platforms/1.1.0", + "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" + }, + "Microsoft.SourceLink.Common/1.1.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg==", + "path": "microsoft.sourcelink.common/1.1.1", + "hashPath": "microsoft.sourcelink.common.1.1.1.nupkg.sha512" + }, + "Microsoft.SourceLink.GitHub/1.1.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-IaJGnOv/M7UQjRJks7B6p7pbPnOwisYGOIzqCz5ilGFTApZ3ktOR+6zJ12ZRPInulBmdAf1SrGdDG2MU8g6XTw==", + "path": "microsoft.sourcelink.github/1.1.1", + "hashPath": "microsoft.sourcelink.github.1.1.1.nupkg.sha512" + }, + "NETStandard.Library/2.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "path": "netstandard.library/2.0.3", + "hashPath": "netstandard.library.2.0.3.nupkg.sha512" + }, + "System.Buffers/4.5.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==", + "path": "system.buffers/4.5.1", + "hashPath": "system.buffers.4.5.1.nupkg.sha512" + }, + "System.Formats.Asn1/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-MTvUIktmemNB+El0Fgw9egyqT9AYSIk6DTJeoDSpc3GIHxHCMo8COqkWT1mptX5tZ1SlQ6HJZ0OsSvMth1c12w==", + "path": "system.formats.asn1/5.0.0", + "hashPath": "system.formats.asn1.5.0.0.nupkg.sha512" + }, + "System.Memory/4.5.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw==", + "path": "system.memory/4.5.4", + "hashPath": "system.memory.4.5.4.nupkg.sha512" + }, + "System.Numerics.Vectors/4.5.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==", + "path": "system.numerics.vectors/4.5.0", + "hashPath": "system.numerics.vectors.4.5.0.nupkg.sha512" + }, + "System.Private.ServiceModel/4.9.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-d3RjkrtpjUQ63PzFmm/SZ4aOXeJNP+8YW5QeP0lCJy8iX4xlHdlNLWTF9sRn9SmrFTK757kQXT9Op/R4l858uw==", + "path": "system.private.servicemodel/4.9.0", + "hashPath": "system.private.servicemodel.4.9.0.nupkg.sha512" + }, + "System.Reflection.DispatchProxy/4.7.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-C1sMLwIG6ILQ2bmOT4gh62V6oJlyF4BlHcVMrOoor49p0Ji2tA8QAoqyMcIhAdH6OHKJ8m7BU+r4LK2CUEOKqw==", + "path": "system.reflection.dispatchproxy/4.7.1", + "hashPath": "system.reflection.dispatchproxy.4.7.1.nupkg.sha512" + }, + "System.Runtime.CompilerServices.Unsafe/4.5.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3TIsJhD1EiiT0w2CcDMN/iSSwnNnsrnbzeVHSKkaEgV85txMprmuO+Yq2AdSbeVGcg28pdNDTPK87tJhX7VFHw==", + "path": "system.runtime.compilerservices.unsafe/4.5.3", + "hashPath": "system.runtime.compilerservices.unsafe.4.5.3.nupkg.sha512" + }, + "System.Security.AccessControl/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", + "path": "system.security.accesscontrol/5.0.0", + "hashPath": "system.security.accesscontrol.5.0.0.nupkg.sha512" + }, + "System.Security.Cryptography.Cng/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-jIMXsKn94T9JY7PvPq/tMfqa6GAaHpElRDpmG+SuL+D3+sTw2M8VhnibKnN8Tq+4JqbPJ/f+BwtLeDMEnzAvRg==", + "path": "system.security.cryptography.cng/5.0.0", + "hashPath": "system.security.cryptography.cng.5.0.0.nupkg.sha512" + }, + "System.Security.Cryptography.Pkcs/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-9TPLGjBCGKmNvG8pjwPeuYy0SMVmGZRwlTZvyPHDbYv/DRkoeumJdfumaaDNQzVGMEmbWtg07zUpSW9q70IlDQ==", + "path": "system.security.cryptography.pkcs/5.0.0", + "hashPath": "system.security.cryptography.pkcs.5.0.0.nupkg.sha512" + }, + "System.Security.Cryptography.Xml/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-MYmkHtCW+paFmPGFDktnLdOeH3zUrNchbZNki87E1ejNSMm9enSRbJokmvFrsWUrDE4bRE1lVeAle01+t6SGhA==", + "path": "system.security.cryptography.xml/5.0.0", + "hashPath": "system.security.cryptography.xml.5.0.0.nupkg.sha512" + }, + "System.Security.Permissions/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-uE8juAhEkp7KDBCdjDIE3H9R1HJuEHqeqX8nLX9gmYKWwsqk3T5qZlPx8qle5DPKimC/Fy3AFTdV7HamgCh9qQ==", + "path": "system.security.permissions/5.0.0", + "hashPath": "system.security.permissions.5.0.0.nupkg.sha512" + }, + "System.Security.Principal.Windows/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==", + "path": "system.security.principal.windows/5.0.0", + "hashPath": "system.security.principal.windows.5.0.0.nupkg.sha512" + }, + "System.ServiceModel.Primitives/4.9.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-LTFPVdS8Nf76xg/wRZkDa+2Q+GnjTOmwkTlwuoetwX37mAfYnGkf7p8ydhpDwVmomNljpUOhUUGxfjQyd5YcOg==", + "path": "system.servicemodel.primitives/4.9.0", + "hashPath": "system.servicemodel.primitives.4.9.0.nupkg.sha512" + }, + "System.Threading.Tasks.Extensions/4.5.4": { + "type": "package", + "serviceable": true, + "sha512": "sha512-zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg==", + "path": "system.threading.tasks.extensions/4.5.4", + "hashPath": "system.threading.tasks.extensions.4.5.4.nupkg.sha512" + }, + "System.ValueTuple/4.5.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ==", + "path": "system.valuetuple/4.5.0", + "hashPath": "system.valuetuple.4.5.0.nupkg.sha512" + }, + "AsyncIO/0.1.69": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "NaCl.Net/0.1.0": { + "type": "project", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NetMQ.deps.json.meta b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NetMQ.deps.json.meta new file mode 100644 index 00000000..d2c1553f --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NetMQ.deps.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 59753e12d18e6ed428ba43f5b724e15c +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NetMQ.dll b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NetMQ.dll new file mode 100644 index 0000000000000000000000000000000000000000..dfd4974b60d3181e9c3df4b9987784fcfc392046 GIT binary patch literal 263168 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�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 j6ws4W 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 + + + Meryel.UnityCodeAssist.NetMQ + + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + Specifies that null is disallowed as an input even if the corresponding type allows it. + + + Specifies that an output may be null even if the corresponding type disallows it. + + + Specifies that an output will not be null even if the corresponding type allows it. + + + Specifies that when a method returns , the parameter may be null even if the corresponding type disallows it. + + + Initializes the attribute with the specified return value condition. + + The return value condition. If the method returns this value, the associated parameter may be null. + + + + Gets the return value condition. + + + Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it. + + + Initializes the attribute with the specified return value condition. + + The return value condition. If the method returns this value, the associated parameter will not be null. + + + + Gets the return value condition. + + + Specifies that the output will be non-null if the named parameter is non-null. + + + Initializes the attribute with the associated parameter name. + + The associated parameter name. The output will be non-null if the argument to the parameter specified is non-null. + + + + Gets the associated parameter name. + + + Applied to a method that will never return under any circumstance. + + + Specifies that the method will not return if the associated Boolean parameter is passed the specified value. + + + Initializes the attribute with the specified parameter value. + + The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to + the associated parameter matches this value. + + + + Gets the condition parameter value. + + + + Provides extension methods for the , + via which messages may be received asynchronously. + + + + + Receive a single frame from , asynchronously. + + The socket to receive from. + Specifies the initial capacity of the used + to buffer results. If the number of frames is known, set it here. If more frames arrive than expected, + an extra allocation will occur, but the result will still be correct. + The token used to propagate notification that this operation should be canceled. + The content of the received message. + + + + Receive a single frame from , asynchronously. + + The socket to receive from. + The token used to propagate notification that this operation should be canceled. + The content of the received message frame and boolean indicate if another frame of the same message follows. + + + + Receive a single frame from , asynchronously, and decode as a string using . + + The socket to receive from. + The token used to propagate notification that this operation should be canceled. + The content of the received message frame as a string and a boolean indicate if another frame of the same message follows. + + + + Receive a single frame from , asynchronously, and decode as a string using . + + The socket to receive from. + The encoding used to convert the frame's data to a string. + The token used to propagate notification that this operation should be canceled. + The content of the received message frame as a string and boolean indicate if another frame of the same message follows.. + + + + Receive a single frame from , asynchronously, then ignore its content. + + The socket to receive from. + The token used to propagate notification that this operation should be canceled. + Boolean indicate if another frame of the same message follows + + + + Receive all frames of the next message from , asynchronously, then ignore their contents. + + The socket to receive from. + + + + Receive a routing-key from , blocking until one arrives. + + The socket to receive from. + The routing key and a boolean indicate if another frame of the same message follows. + + + + The IBufferPool interface specifies two methods: Take, and Return. + These provide for taking atomic counters from a common pool, and returning them. + + + + + Take an AtomicCounter from the pool. + + an atomic counter + + + + Return the given atomic counter to the common pool. + + the atomic counter to return to the buffer-pool + + + + This simple implementation of does no pooling. Instead, it uses regular + .NET memory management to allocate a counter each time is called. Unused counters + passed to are simply left for the .NET garbage collector to deal with. + + + + + Return a newly-allocated atomic counterfrom the pool. + + an atomic counter + + + + The expectation of an actual pool is that this method returns the given counter to the manager pool. + This particular implementation does nothing. + + a reference to the counter being returned + + + + The expectation of an actual pool is that the Dispose method will release the pools currently cached in this manager. + This particular implementation does nothing. + + + + + Release the counters currently cached in this manager (however in this case, this does nothing). + + true if managed resources are to be disposed + + + + Contains a singleton instance of used for allocating atomic counters + for instances with type . + + + Sending and receiving messages with pooling mode, requires the use of atomic counters. + You can use the AtomicCounterPool class to pool counters for reuse, reducing allocation, deallocation and garbage collection. + + The default implementation is . + + Call to reinstate the default . + Call to substitute a custom implementation for the allocation and + deallocation of atomic counters. + + + + + + Set BufferPool to use the (which it does by default). + + + + + Set BufferPool to use the specified IAtomicCounterPool implementation to manage the pool. + + the implementation of to use + + + + Allocate an atomic counter from the current . + + an atomic counter + + + + Returns to the . + + The atomic counter to be returned to the pool. + + + + The IBufferPool interface specifies two methods: Take, and Return. + These provide for taking byte-array data from a common pool, and returning it. + + + + + Take byte-array storage from the buffer-pool. + + the number of bytes to take + a byte-array that comes from the buffer-pool + + + + Return the given byte-array buffer to the common buffer-pool. + + the byte-array to return to the buffer-pool + + + + This implementation of uses WCF's + class to manage a pool of buffers. + + + + + Create a new BufferManagerBufferPool with the specified maximum buffer pool size + and a maximum size for each individual buffer in the pool. + + the maximum size to allow for the buffer pool + the maximum size to allow for each individual buffer in the pool + There was insufficient memory to create the requested buffer pool. + Either maxBufferPoolSize or maxBufferSize was less than zero. + + + + Return a byte-array buffer of at least the specified size from the pool. + + the size in bytes of the requested buffer + a byte-array that is the requested size + size cannot be less than zero + + + + Return the given buffer to this manager pool. + + a reference to the buffer being returned + the Length of buffer does not match the pool's buffer length property + the buffer reference cannot be null + + + + Release the buffers currently cached in this manager. + + + + + Release the buffers currently cached in this manager. + + true if managed resources are to be disposed + + + + This simple implementation of does no buffer pooling. Instead, it uses regular + .NET memory management to allocate a buffer each time is called. Unused buffers + passed to are simply left for the .NET garbage collector to deal with. + + + + + Return a newly-allocated byte-array buffer of at least the specified size from the pool. + + the size in bytes of the requested buffer + a byte-array that is the requested size + there is not sufficient memory to allocate the requested memory + + + + The expectation of an actual buffer-manager is that this method returns the given buffer to the manager pool. + This particular implementation does nothing. + + a reference to the buffer being returned + + + + The expectation of an actual buffer-manager is that the Dispose method will release the buffers currently cached in this manager. + This particular implementation does nothing. + + + + + Release the buffers currently cached in this manager (however in this case, this does nothing). + + true if managed resources are to be disposed + + + + Contains a singleton instance of used for allocating byte arrays + for instances with type . + + + Sending and receiving message frames requires the use of buffers (byte arrays), which are expensive to create and destroy. + You can use the BufferPool class to pool buffers for reuse, reducing allocation, deallocation and garbage collection. + + The default implementation is . + + Call to replace it with a . + Call to reinstate the default . + Call to substitute a custom implementation for the allocation and + deallocation of message buffers. + + + + + + Set BufferPool to use the (which it does by default). + + + + + Set BufferPool to use the to manage the buffer-pool. + + the maximum size to allow for the buffer pool + the maximum size to allow for each individual buffer in the pool + There was insufficient memory to create the requested buffer pool. + Either maxBufferPoolSize or maxBufferSize was less than zero. + + + + Set BufferPool to use the specified IBufferPool implementation to manage the buffer-pool. + + the implementation of to use + + + + Allocate a buffer of at least bytes from the current . + + The minimum size required, in bytes. + A byte array having at least bytes. + + + + Returns to the . + + The byte array to be returned to the pool. + + + + Class Address contains a specification of a protocol and an MqEndPoint. + + + + + The string-literal "inproc" + - this denotes in-process, or inter-thread, communication. + + + + + The string-literal "tcp" + - this denotes TCP communication over the network. + + + + + The string-literal "ipc" + - this denotes inter-process communication, which on NetMQ is exactly the same as TCP. + + + + + The string-literal "pgm" + - this denotes the Pragmatic General Multicast (PGM) reliable multicast protocol. + + + + + The string-literal "epgm" + - this denotes the Encapsulated PGM protocol. + + + + + Interface IZAddress specifies that Resolve and property Address must be implemented. + + + + + Create a new Address instance with the given protocol and text expression of an address. + + the protocol of this Address - as in tcp, ipc, pgm + a text representation of the address + + + + Create a new Address instance based upon the given endpoint, assuming a protocol of tcp. + + the subclass of EndPoint to base this Address upon + + + + Defines a command sent between threads. + + + + + Create a new Command object for the given destination, type, and optional argument. + + a ZObject that denotes the destination for this command + the CommandType of the new command + an Object to comprise the argument for the command (optional) + + + The destination to which the command should be applied. + + + The type of this command. + + + + Get the argument to this command. + + + + + Override of ToString, which returns a string in the form [ command-type, destination ]. + + a string that denotes the command-type and destination + + + + Enumeration of possible types. + + + The value of denotes what action + the command will perform. + + + + + Sent to I/O thread to let it know that it should + terminate itself. + + + + + Sent to I/O object to make it register with its I/O thread + + + + + Sent to socket to let it know about the newly created object. + + + + + Attach the engine to the session. If engine is NULL, it informs + session that the connection has failed. + + + + + Sent from session to socket to establish pipe(s) between them. + Caller must have used inc_seqnum before sending the command. + + + + + Sent by pipe writer to inform dormant pipe reader that there + are messages in the pipe. + + + + + Sent by pipe reader to inform pipe writer how many + messages it has read so far. + + + + + Sent by pipe reader to writer after creating a new inpipe. + The parameter is actually of type pipe_t::upipe_t, however, + its definition is private so we'll have to do with void*. + + + + + Sent by pipe reader to pipe writer to ask it to terminate + its end of the pipe. + + + + + Pipe writer acknowledges pipe_term command. + + + + + Sent by I/O object to the socket to request the shutdown of + the I/O object. + + + + + Sent by socket to I/O object to start its shutdown. + + + + + Sent by I/O object to the socket to acknowledge it has + shut down. + + + + + Transfers the ownership of the closed socket + to the reaper thread. + + + + + Closed socket notifies the reaper that it's already deallocated. + + + + + Sent by reaper thread to the term thread when all the sockets + have successfully been deallocated. + + + + + Send to reaper to stop the reaper immediatly + + + + + Send a cancellation request to the socket from a cancellation token + + + + + This class exists to hold constant values that comprise the internal configuration of the messaging system. + + + + + Number of new messages in message pipe needed to trigger new memory + allocation. Setting this parameter to 256 decreases the impact of + memory allocation by approximately 99.6% + + + + + Commands in pipe per allocation event. + + + + + Determines how often does socket poll for new commands when it + still has unprocessed messages to handle. Thus, if it is set to 100, + socket will process 100 inbound messages before doing the poll. + If there are no unprocessed messages available, poll is done + immediately. Decreasing the value trades overall latency for more + real-time behaviour (less latency peaks). + + + + + Maximal batching size for engines with receiving functionality. + So, if there are 10 messages that fit into the batch size, all of + them may be read by a single 'recv' system call, thus avoiding + unnecessary network stack traversals. + + + + + Maximal batching size for engines with sending functionality. + So, if there are 10 messages that fit into the batch size, all of + them may be written by a single 'send' system call, thus avoiding + unnecessary network stack traversals. + + + + + Maximal delta between high and low watermark. + + + + + Maximum number of events the I/O thread can process in one go. + + + + + Maximal delay to process command in API thread (in CPU ticks). + 3,000,000 ticks equals to 1 - 2 milliseconds on current CPUs. + Note that delay is only applied when there is continuous stream of + messages to process. If not so, commands are processed immediately. + + + + + Low-precision clock precision in CPU ticks. 1ms. Value of 1000000 + should be OK for CPU frequencies above 1GHz. If should work + reasonably well for CPU frequencies above 500MHz. For lower CPU + frequencies you may consider lowering this value to get best + possible latencies. + + + + + Maximum transport data unit size for PGM (TPDU). + + + + + On some OSes the signaler has to be emulated using a TCP + connection. In such cases following port is used. + + + + + Objects of class Ctx are intended to encapsulate all of the global state + associated with the NetMQ library. This contains the sockets, and manages interaction + between them. + + + + + Information associated with inproc endpoint. Note that endpoint options + are registered as well so that the peer can access them without a need + for synchronisation, handshaking or similar. + + + + + Create a new Endpoint with the given socket. + + the socket for this new Endpoint + the Options to assign to this new Endpoint + + + + Get the socket associated with this Endpoint. + + + + + Get the Options of this Endpoint. + + + + + Sockets belonging to this context. We need the list so that + we can notify the sockets when zmq_term() is called. The sockets + will return ETERM then. + + + + + List of unused thread slots. + + + + + If true, zmq_init has been called but no socket has been created + yet. Launching of I/O threads is delayed. + + + + + If true, zmq_term was already called. + + + + + This object is for synchronisation of accesses to global slot-related data: + sockets, empty_slots, terminating. It also synchronises + access to zombie sockets as such (as opposed to slots) and provides + a memory barrier to ensure that all CPU cores see the same data. + + + + + The reaper thread. + + + + + List of I/O threads. + + + + + Length of the mailbox-array. + + + + + Array of pointers to mailboxes for both application and I/O threads. + + + + + Mailbox for zmq_term thread. + + + + + Dictionary containing the inproc endpoints within this context. + + + + + This object provides synchronisation of access to the list of inproc endpoints. + + + + + The highest socket-id that has been assigned thus far. + + + + + The maximum number of sockets that can be opened at the same time. + + + + + The number of I/O threads to launch. + + + + + This object is used to synchronize access to context options. + + + + + The thread-id for the termination (the equivalent of the zmq_term) thread. + + + + + This is the thread-id to assign to the Reaper (value is 1). + + + + + This function is called when user invokes zmq_term. If there are + no more sockets open it'll cause all the infrastructure to be shut + down. If there are open sockets still, the deallocation happens + after the last one is closed. + + + + + Create and return a new socket of the given type, and initialize this Ctx if this is the first one. + + the type of socket to create + the newly-created socket + Cannot create new socket while terminating. + Maximum number of sockets reached. + The context (Ctx) must not be already terminating. + + + + Destroy the given socket - which means to remove it from the list of active sockets, + and add it to the list of unused sockets to be terminated. + + the socket to destroy + + If this was the last socket, then stop the reaper. + + + + + Returns reaper thread object. + + + + + Send a command to the given destination thread. + + + + + Returns the that is the least busy at the moment. + + Which threads are eligible (0 = all). + The least busy thread, or null if none is available. + + + + Save the given address and Endpoint within our internal list. + This is used for management of inproc endpoints. + + the textual name to give this endpoint + the Endpoint to remember + true if the given address was NOT already registered + + + + Un-register the given address/socket, by removing it from the contained list of endpoints. + + the (string) address denoting the endpoint to unregister + the socket associated with that endpoint + true if the endpoint having this address and socket is found, false otherwise + + + + Remove from the list of endpoints, all endpoints that reference the given socket. + + the socket to remove all references to + + + + Return the EndPoint that has the given address, and increments the seqnum of the associated socket. + + the (string) address to match against the endpoints + the Endpoint that was found + The given address was not found in the list of endpoints. + + By calling this method, the socket associated with that returned EndPoint has it's Seqnum incremented, + in order to prevent it from being de-allocated before a command can be sent to it. + + + + + Class ErrorHelper provides one static method - ToErrorCode, for converting a SocketError to the equivalent ErrorCode. + + + + + Return the ErrorCode that is the closest equivalent to the given SocketError. + + the SocketError to convert from + an ErrorCode that corresponds to the given SocketError + + + + Simple base class for objects that live in I/O threads. + It makes communication with the poller object easier and + makes defining unneeded event handlers unnecessary. + + + + + Create a new IOObject object and plug it into the given IOThread. + + the IOThread to plug this new IOObject into. + + + + "Plug in" this IOObject to the given IOThread, - ie associate this with the specified IOThread. + + the IOThread for this object to live in + + When migrating an object from one I/O thread to another, first + unplug it, then migrate it, then plug it to the new thread. + + + + + "Un-Plug" this IOObject from its current IOThread, and set its handler to null. + + + When migrating an object from one I/O thread to another, first + unplug it, then migrate it, then plug it to the new thread. + + + + + Add the given socket to the Proactor. + + the AsyncSocket to add + + + + Remove the given socket from the Proactor. + + the AsyncSocket to remove + + + + This method is called when a message receive operation has been completed. This forwards it on to the handler's InCompleted method. + + a SocketError value that indicates whether Success or an error occurred + the number of bytes that were transferred + + + + This method is called when a message Send operation has been completed. This forwards it on to the handler's OutCompleted method. + + a SocketError value that indicates whether Success or an error occurred + the number of bytes that were transferred + + + + This is called when the timer expires. + + an integer used to identify the timer + + + + I/O thread accesses incoming commands via this mailbox. + + + + + I/O multiplexing is performed using a poller object. + + + + + Create a new IOThread object within the given context (Ctx) and thread. + + the Ctx (context) for this thread to live within + the integer thread-id for this new IOThread + + + + Classes that implement IPollEvents provide two methods (InEvent and OutEvent) that are invoked when ready for reading or writing. + + + + + Called by the I/O thread when the file descriptor is ready for reading. + + + + + Called by the I/O thread when the file descriptor is ready for writing. + + + + + This is an ITimerEvent, with InCompleted and OutCompleted callback-methods, + used for implementing a Proactor pattern. + + + + + This is the "Input-Completed" method - called by the I/O-thread when the file descriptor is ready for reading. + + this is set to any socket-error that has occurred + the number of bytes that are now ready to be read + + + + This is the "Output-Completed" method - called by the I/O thread when the file descriptor is ready for writing. + + this is set to any socket-error that has occurred + the number of bytes that are now ready to be written + + + + The ITimerEvent interface mandates a TimerEvent( int id ) method, + that is called with an id-value when the timer expires. + + + + + This is called when the timer expires. + + an integer used to identify the timer + + + + There's only one thread receiving from the mailbox, but there + is arbitrary number of threads sending. Given that ypipe requires + synchronised access on both of its endpoints, we have to synchronize + the sending side. + + + + + The pipe to store actual commands. + + + + + Signaler to pass signals from writer thread to reader thread. + + + + + There's only one thread receiving from the mailbox, but there + is an arbitrary number of threads sending. Given that requires + synchronised access on both of its endpoints, we have to synchronize + the sending side. + + + + + True if the underlying pipe is active, ie. when we are allowed to + read commands from it. + + + + + Create a new Mailbox with the given name. + + the name to give this new Mailbox + + + + Get the socket-handle contained by the Signaler. + + + + + Send the given Command out across the command-pipe. + + the Command to send + + + + Receive and return a Command from the command-pipe. + + how long to wait for a command (in milliseconds) before returning + + + + + Close the contained Signaler. + + + + + The pipe to store actual commands. + + + + + Create a new MailboxSafe with the given name. + + the name to give this new Mailbox + Synchronize access to the mailbox from receivers and senders + + + + Prepare next handshake command that is to be sent to the peer. + + + + + + + Process the handshake command received from the peer. + + + + + + + Dispose the mechanism resources + + + + + Returns the status of this mechanism. + + + + + Only used to identify the socket for the Socket-Type + property in the wire protocol. + + + + + + Parses a metadata. + Metadata consists of a list of properties consisting of + name and value as size-specified strings. + + Returns true on success and false on error. + + + + This is called by ParseProperty method whenever it + parses a new property. The function returns true + on success and false on error. Signaling error prevents parser from + parsing remaining data. + Derived classes are supposed to override this + method to handle custom processing. + + + + + + Returns true iff socket associated with the mechanism + is compatible with a given socket type 'type'. + + + + + + Class Options is essentially a container for socket-related option-settings. + + + + + Create a new Options object with all default values. + + + + + Get or set the I/O-thread affinity. + The default value is 0. + + + + + Maximum backlog for pending connections. + The default value is 100. + + + + + Get or set whether connecting pipes are not attached immediately, meaning a send() + on a socket with only connecting pipes would block. + The default value is false. + + + + + Get or set the Endian-ness, which indicates whether the most-significant bits are placed higher or lower in memory. + The default value is Endianness.Big. + + + + + If true, (X)SUB socket should filter the messages. If false (which is the default), it should not. + + + + + Get or set the byte-array that represents the Identity. + The initial value is null. + + + + + Get or set the size of the socket-identity byte-array. + The initial value is 0, until the Identity property is set. + + + + + Get or set whether this allows the use of IPv4 sockets only. + If true (the default), it will not be possible to communicate with IPv6-only hosts. + If false, the socket can connect to and accept connections from both IPv4 and IPv6 hosts. + + + + + Get or set the last socket endpoint resolved URI + The initial value is null. + + + + + Get or set the Linger time, in milliseconds. + The default value is -1; The XSub ctor sets this to 0. + + + + + Get or set the maximum size of message to handle. + The default value is -1, which indicates no limit. + + + + + Sets the time-to-live field in every multicast packet sent. + The default value is 1. + + + + + Get or set the maximum transfer rate [Kb/s]. The default is 100 Kb/s. + + + + + If true, router socket accepts non-zmq tcp connections + The default value is false, except the Stream ctor initialises this to true. + Setting this to true changes RecvIdentity to false. + + + + + If true, the identity message is forwarded to the socket. + The default value is false. + + + + + Get or set the minimum interval between attempts to reconnect, in milliseconds. + The default is 100 ms + + + + + Get or set the maximum interval between attempts to reconnect, in milliseconds. + The default is 0 (unused). + + + + + Get or set the recovery time interval [ms]. The default is 10 seconds. + + + + + SO_SNDBUF and SO_RCVBUF to be passed to underlying transport sockets. + The initial value is 0. + + + + + Get or set the size of the receive-buffer. + The initial value is 0. + + + + + Get or set the high-water marks for message pipes. + The default value is 1000. + + + + + Get or set the high-water mark for message reception. + The default value is 1000. + + + + + The low-water mark for message transmission. + + + + + The low-water mark for message reception. + + + + + Get or set the timeout for send operations for this socket. + The default value is -1, which means no timeout. + + + + + Get or set the ID of the socket. + The default value is 0. + + + + + Get or set the type of socket (ZmqSocketType). + The default value is ZmqSocketType.None. + + + + + TCP keep-alive settings. + Defaults to -1 = do not change socket options + + + + + Get or set the TCP Keep-Alive Count. + The default value is -1. + + + + + Get or set the TCP Keep-Alive interval to use when at idle. + The default value is -1. + + + + + Get or set the TCP Keep-Alive Interval + The default value is -1. + + + + + Disable TIME_WAIT tcp state when client disconnect. + The default value is false. + + + + + Controls the maximum datagram size for PGM. + + + + + Security mechanism for all connections on this socket + + + + + If peer is acting as server for PLAIN or CURVE mechanisms + + + + + Security credentials for CURVE mechanism + + + + + Security credentials for CURVE mechanism + + + + + Security credentials for CURVE mechanism + + + + + If remote peer receives a PING message and doesn't receive another + message within the ttl value, it should close the connection + (measured in tenths of a second) + + + + + Time in milliseconds between sending heartbeat PING messages. + + + + + Time in milliseconds to wait for a PING response before disconnecting + + + + + Hello msg to send to peer upon connecting + + + + + Indicate of socket can send an hello msg + + + + + Assign the given optionValue to the specified option. + + a ZmqSocketOption that specifies what to set + an Object that is the value to set that option to + The option and optionValue must be valid. + + + + Get the value of the specified option. + + a ZmqSocketOption that specifies what to get + an Object that is the value of that option + A valid option must be specified. + + + + Base class for objects forming a part of ownership hierarchy. + It handles initialisation and destruction of such objects. + + + + + The Options of this Own. + + + + + True if termination was already initiated. If so, we can destroy + the object if there are no more child objects or pending term acks. + + + + + Sequence number of the last command sent to this object. + + + + + Sequence number of the last command processed by this object. + + + + + Socket owning this object. It's responsible for shutting down + this object. + + + + + List of all objects owned by this socket. We are responsible + for deallocating them before we quit. + + + + + Number of events we have to get before we can destroy the object. + + + + + Initializes a new instance of the class that is running on a thread outside of 0MQ infrastructure. + + The parent context. + The thread id. + + Note that the owner is unspecified in the constructor. It'll be assigned later on using + when the object is plugged in. + + + + + Initializes a new instance of the class that is running within I/O thread. + + The I/O thread. + The options. + + Note that the owner is unspecified in the constructor. It'll be assigned later on using + when the object is plugged in. + + + + + Eliminate any contained resources that need to have this explicitly done. + + + + + A place to hook in when physical destruction of the object is to be delayed. + Unless overridden, this simply calls Destroy. + + + + + Set the owner of *this* Own object, to be the given owner. + + the Own object to be our new owner + + + + When another owned object wants to send a command to this object it calls this function + to let it know it should not shut down before the command is delivered. + + + This function may be called from a different thread! + + + + + Launch the supplied object and become its owner. + + The object to be launched. + + + + Terminate owned object. + + + + + Process a termination-request for the given Own obj, + removing it from the listed of owned things. + + the Own object to remove and terminate + + + + Add the given Own object to the list of owned things. + + the Own object to add to our list + + If *this* Own is already terminating, then send a request to the given Own obj + to terminate itself. + + + + + Ask owner object to terminate this object. It may take a while actual termination is started. + + + This function should not be called more than once. + + + + + Returns true if the object is in process of termination. + + + + + Send termination requests to all of the owned objects, and then runs the termination process. + + the linger time, in milliseconds + + Termination handler is protected rather than private so that it can be intercepted by the derived class. + This is useful to add custom steps to the beginning of the termination process. + + + + + Add the given number to the termination-acknowledgement count. + + + The methods RegisterTermAcks and are used to wait for arbitrary events before + terminating. Just add the number of events to wait for, and when the event occurs - call . + When the number of pending termination-acknowledgements reaches zero, this object will be deallocated. + + + + + Decrement the termination-acknowledgement count, and if it reaches zero + then send a termination-ack to the owner. + + + The methods and UnregisterTermAck are used to wait for arbitrary events before + terminating. Just add the number of events to wait for, and when the event occurs - call UnregisterTermAck. + When the number of pending termination-acknowledgements reaches zero, this object will be deallocated. + + + + + Process the first termination-acknowledgement. + Unless this is overridden, it simply calls . + + + + + If terminating, and we've already worked through the Seq-nums that were sent, + then send a termination-ack to the owner (if there is one) and destroy itself. + + + + + A Client socket is a SocketBase. + + + + + Messages are fair-queued from inbound pipes. And load-balanced to + the outbound pipes. + + + + + Create a new Dealer socket that holds the prefetched message. + + + + + Register the pipe with this socket. + + the Pipe to attach + not used + + + + Transmit the given message. The Send method calls this to do the actual sending. + + the message to transmit + true if the message was sent successfully + + + + Get a message from FairQueuing data structure + + a Msg to receive the message into + true if the message was received successfully, false if there were no messages to receive + + + + If there is a message available and one has not been pre-fetched yet, + preserve that message as our pre-fetched one. + + + + + + Indicate the given pipe as being ready for reading by this socket. + + the Pipe that is now becoming available for reading + + + + Indicate the given pipe as being ready for writing to by this socket. + This gets called by the WriteActivated method + and gets overridden by the different sockets + to provide their own concrete implementation. + + the Pipe that is now becoming available for writing + + + + This is an override of the abstract method that gets called to signal that the given pipe is to be removed from this socket. + + the Pipe that is being removed + + + + A Dealer socket is a SocketBase that is used as the parent-class of the Req socket. + It provides for a pre-fetched Msg, and skips identity-messages. + + + + + Messages are fair-queued from inbound pipes. And load-balanced to + the outbound pipes. + + + + + Create a new Dealer socket that holds the prefetched message. + + + + + Register the pipe with this socket. + + the Pipe to attach + not used + + + + Transmit the given message. The Send method calls this to do the actual sending. + + the message to transmit + true if the message was sent successfully + + + + Transmit the given message. The Send method calls this to do the actual sending. + + the message to transmit + the pipe that the message was transmitted on (output) + true if the message was sent successfully + + + + Get a message from FairQueuing data structure + + a Msg to receive the message into + true if the message was received successfully, false if there were no messages to receive + + + + Get a message from FairQueuing data structure + + a Msg to receive the message into + a specific Pipe to receive on + true if the message was received successfully, false if there were no messages to receive + + + + If there is a message available and one has not been pre-fetched yet, + preserve that message as our pre-fetched one. + + + + + + Indicate the given pipe as being ready for reading by this socket. + + the Pipe that is now becoming available for reading + + + + Indicate the given pipe as being ready for writing to by this socket. + This gets called by the WriteActivated method + and gets overridden by the different sockets + to provide their own concrete implementation. + + the Pipe that is now becoming available for writing + + + + This is an override of the abstract method that gets called to signal that the given pipe is to be removed from this socket. + + the Pipe that is being removed + + + + Fair queueing object for inbound pipes. + + + + + Register the pipe with this socket. + + the Pipe to attach + not used + + + + Indicate the given pipe as being ready for reading by this socket. + + the Pipe that is now becoming available for reading + + + + This is an override of the abstract method that gets called to signal that the given pipe is to be removed from this socket. + + the Pipe that is being removed + + + + Receive a message. The Recv method calls this lower-level method to do the actual receiving. + + the Msg to receive the message into + true if the message was received successfully, false if there were no messages to receive + + + + Register the pipe with this socket. + + the Pipe to attach + not used + + + + This is an override of the abstract method that gets called to signal that the given pipe is to be removed from this socket. + + the Pipe that is being removed + + + + Indicate the given pipe as being ready for reading by this socket + - however in the case of Pair, this does nothing. + + the Pipe that is now becoming available for reading + + + + Indicate the given pipe as being ready for writing to by this socket, + however in the case of this Pair socket - this does nothing. + This method gets called by the WriteActivated method. + + the Pipe that is now becoming available for writing + + + + Transmit the given message. The Send method calls this to do the actual sending. + + the message to transmit + true if the message was sent successfully + + + + Receive a message. The Recv method calls this lower-level method to do the actual receiving. + + the Msg to receive the message into + true if the message was received successfully, false if there were no messages to receive + + + + A Router is a subclass of SocketBase + + + + + An instance of class Outpipe contains a Pipe and a boolean property Active. + + + + + Fair queueing object for inbound pipes. + + + + + Holds the prefetched message. + + + + + Outbound pipes indexed by the peer IDs. + + + + + The pipe we are currently writing to. + + + + + State of the recv operation + + + + + State of the sending operation + + + + + Peer ID are generated. It's a simple increment and wrap-over + algorithm. This value is the next ID to use (if not used already). + + + + + Create a new Router instance with the given parent-Ctx, thread-id, and socket-id. + + the Ctx that will contain this Router + the integer thread-id value + the integer socket-id value + + + + Register the pipe with this socket. + + the Pipe to attach + not used + + + + This is an override of the abstract method that gets called to signal that the given pipe is to be removed from this socket. + + the Pipe that is being removed + + + + Indicate the given pipe as being ready for reading by this socket. + + the Pipe that is now becoming available for reading + + + + Indicate the given pipe as being ready for writing to by this socket. + This gets called by the WriteActivated method. + + the Pipe that is now becoming available for writing + + + + Transmit the given message. The Send method calls this to do the actual sending. + + the message to transmit + true if the message was sent successfully + The receiving host must be identifiable. + + + + Receive a message. The Recv method calls this lower-level method to do the actual receiving. + + the Msg to receive the message into + true if the message was received successfully, false if there were no messages to receive + + + + This override of the abstract XRecv method, simply throws a NotSupportedException because XRecv is not supported on a Pub socket. + + the Msg to receive the message into + Messages cannot be received from PUB socket + + + + Fair queueing object for inbound pipes. + + + + + Register the pipe with this socket. + + the Pipe to attach + not used + + + + Indicate the given pipe as being ready for reading by this socket. + + the Pipe that is now becoming available for reading + + + + This is an override of the abstract method that gets called to signal that the given pipe is to be removed from this socket. + + the Pipe that is being removed + + + + Receive a message. The Recv method calls this lower-level method to do the actual receiving. + + the Msg to receive the message into + true if the message was received successfully, false if there were no messages to receive + + + + Load balancer managing the outbound pipes. + + + + + Register the pipe with this socket. + + the Pipe to attach + not used + + + + Indicate the given pipe as being ready for writing to by this socket. + This gets called by the WriteActivated method. + + the Pipe that is now becoming available for writing + + + + This is an override of the abstract method that gets called to signal that the given pipe is to be removed from this socket. + + the Pipe that is being removed + + + + Transmit the given message. The Send method calls this to do the actual sending. + + the message to transmit + true if the message was sent successfully + + + + If true, we are in process of sending the reply. If false we are + in process of receiving a request. + + + + + If true, we are starting to receive a request. The beginning + of the request is the backtrace stack. + + + + + Transmit the given message. The Send method calls this to do the actual sending. + + the message to transmit + true if the message was sent successfully + XSend must only be called on Rep when in the state of sending a reply. + + + + Receive a message. The Recv method calls this lower-level method to do the actual receiving. + + the Msg to receive the message into + true if the message was received successfully, false if there were no messages to receive + XRecv must not be called on Rep while in the state of sending a reply. + + + + A Req is a Dealer socket that serves as the Request in a Request/Response pattern. + + + + + If true, request was already sent and reply wasn't received yet or + was received partially. + + + + + If true, we are starting to send/receive a message. The first part + of the message must be empty message part (backtrace stack bottom). + + + + + if true, strict semantics are obeyed for request/reply patterns. If false, + relaxed semantics are used in accordance with ZMQ_REQ_RELAXED. + + + + + if true, request id's are correlated in accordance with ZMQ_REQ_CORRELATE. + + + + + A request identifier used in conjunction with m_request_id_frames_enabled; used + to match (correlate) the reply to the corresponding request. + + + + + specific pipe that we are expecting the reply to occur on, once we make a request. + + + + + Create a new Req (Request) socket with the given parent Ctx, thread and socket id. + + the Ctx to contain this socket + an integer thread-id for this socket to execute on + the socket-id for this socket + + + + Transmit the given message. The Send method calls this to do the actual sending. + + the message to transmit + true if the message was sent successfully + Cannot XSend on a Req while awaiting reply. + + + + Receive a message. The Recv method calls this lower-level method to do the actual receiving. + + the Msg to receive the message into + true if the message was received successfully, false if there were no messages to receive + Req.XRecv expecting send, not receive. + + + + A Router is a subclass of SocketBase + + + + + An instance of class Outpipe contains a Pipe and a boolean property Active. + + + + + Fair queueing object for inbound pipes. + + + + + True if there is a message held in the pre-fetch buffer. + + + + + If true, the receiver got the message part with + the peer's identity. + + + + + Holds the prefetched identity. + + + + + Holds the prefetched message. + + + + + If true, more incoming message parts are expected. + + + + + We keep a set of pipes that have not been identified yet. + + + + + Outbound pipes indexed by the peer IDs. + + + + + The pipe we are currently writing to. + + + + + The pipe we are currently reading from. + + + + + If true, more outgoing message parts are expected. + + + + + Peer ID are generated. It's a simple increment and wrap-over + algorithm. This value is the next ID to use (if not used already). + + + + + If true, report EHOSTUNREACH to the caller instead of silently dropping + the message targeting an unknown peer. + + + + + If true, router socket accepts non-zmq tcp connections + + + + + When enabled new router connections with same identity take over old ones + + + + + Create a new Router instance with the given parent-Ctx, thread-id, and socket-id. + + the Ctx that will contain this Router + the integer thread-id value + the integer socket-id value + + + + Register the pipe with this socket. + + the Pipe to attach + not used + + + + This is an override of the abstract method that gets called to signal that the given pipe is to be removed from this socket. + + the Pipe that is being removed + + + + Indicate the given pipe as being ready for reading by this socket. + + the Pipe that is now becoming available for reading + + + + Indicate the given pipe as being ready for writing to by this socket. + This gets called by the WriteActivated method. + + the Pipe that is now becoming available for writing + + + + Transmit the given message. The Send method calls this to do the actual sending. + + the message to transmit + true if the message was sent successfully + The receiving host must be identifiable. + + + + Receive a message. The Recv method calls this lower-level method to do the actual receiving. + + the Msg to receive the message into + true if the message was received successfully, false if there were no messages to receive + + + + Load balancer managing the outbound pipes. + + + + + Register the pipe with this socket. + + the Pipe to attach + not used + + + + Indicate the given pipe as being ready for writing to by this socket. + This gets called by the WriteActivated method. + + the Pipe that is now becoming available for writing + + + + This is an override of the abstract method that gets called to signal that the given pipe is to be removed from this socket. + + the Pipe that is being removed + + + + Transmit the given message. The Send method calls this to do the actual sending. + + the message to transmit + true if the message was sent successfully + + + + A Server is a subclass of SocketBase + + + + + An instance of class Outpipe contains a Pipe and a boolean property Active. + + + + + Fair queueing object for inbound pipes. + + + + + Outbound pipes indexed by the Routing IDs. + + + + + Peer ID are generated. It's a simple increment and wrap-over + algorithm. This value is the next ID to use (if not used already). + + + + + Create a new Router instance with the given parent-Ctx, thread-id, and socket-id. + + the Ctx that will contain this Router + the integer thread-id value + the integer socket-id value + + + + Register the pipe with this socket. + + the Pipe to attach + not used + + + + This is an override of the abstract method that gets called to signal that the given pipe is to be removed from this socket. + + the Pipe that is being removed + + + + Indicate the given pipe as being ready for reading by this socket. + + the Pipe that is now becoming available for reading + + + + Indicate the given pipe as being ready for writing to by this socket. + This gets called by the WriteActivated method. + + the Pipe that is now becoming available for writing + + + + Transmit the given message. The Send method calls this to do the actual sending. + + the message to transmit + true if the message was sent successfully + The receiving host must be identifiable. + + + + Receive a message. The Recv method calls this lower-level method to do the actual receiving. + + the Msg to receive the message into + true if the message was received successfully, false if there were no messages to receive + + + + Fair queueing object for inbound pipes. + + + + + True if there is a message held in the pre-fetch buffer. + + + + + If true, the receiver got the message part with + the peer's identity. + + + + + Holds the prefetched identity. + + + + + Holds the prefetched message. + + + + + Outbound pipes indexed by the peer IDs. + + + + + The pipe we are currently writing to. + + + + + If true, more outgoing message parts are expected. + + + + + Peer ID are generated. It's a simple increment and wrap-over + algorithm. This value is the next ID to use (if not used already). + + + + + Register the pipe with this socket. + + the Pipe to attach + not used + + + + This is an override of the abstract method that gets called to signal that the given pipe is to be removed from this socket. + + the Pipe that is being removed + + + + Indicate the given pipe as being ready for reading by this socket. + + the Pipe that is now becoming available for reading + + + + Indicate the given pipe as being ready for writing to by this socket. + This gets called by the WriteActivated method. + + the Pipe that is now becoming available for writing + + + + Transmit the given message. The Send method calls this to do the actual sending. + + the message to transmit + true if the message was sent successfully + In Stream.XSend + + + + Receive a message. The Recv method calls this lower-level method to do the actual receiving. + + the Msg to receive the message into + true if the message was received successfully, false if there were no messages to receive + + + + Set the specified option on this socket - which must be either a SubScribe or an Unsubscribe. + + which option to set + the value to set the option to + true if successful + optionValue must be a String or a byte-array. + + + + XSend transmits a given message. The Send method calls this to do the actual sending. + This override of that abstract method simply throws NotSupportedException because XSend is not supported on a Sub socket. + + the message to transmit + XSend not supported on Sub socket + + + + Return false to indicate that XHasOut is not applicable on a Sub socket. + + + + + + Make resize operation on array. + + Type of containing data. + Source array. + New size of array. + If grow/shrink operation should be applied to the end of array. + Resized array. + + + + List of outbound pipes. + + + + + Number of all the pipes to send the next message to. + + + + + Number of active pipes. All the active pipes are located at the + beginning of the pipes array. These are the pipes the messages + can be sent to at the moment. + + + + + Number of pipes eligible for sending messages to. This includes all + the active pipes plus all the pipes that we can in theory send + messages to (the HWM is not yet reached), but sending a message + to them would result in partial message being delivered, ie. message + with initial parts missing. + + + + + True if last we are in the middle of a multipart message. + + + + + Create a new, empty Distribution object. + + + + + Adds the pipe to the distributor object. + + + + + + Mark the pipe as matching. Subsequent call to send_to_matching + will send message also to this pipe. + + + + + + Mark all pipes as non-matching. + + + + + This gets called by ProcessPipeTermAck or XTerminated to respond to the termination of the given pipe from the distributor. + + the pipe that was terminated + + + + Activates pipe that have previously reached high watermark. + + + + + + Send the message to all the outbound pipes. + + + + + + Send the message to the matching outbound pipes. + + + + + + Put the message to all active pipes. + + + + + Write the message to the pipe. Make the pipe inactive if writing + fails. In such a case false is returned. + + + + + This class manages a set of inbound pipes. On receive it performs fair + queueing so that senders gone berserk won't cause denial of + service for decent senders. + + + + + Inbound pipes. + + + + + Number of active pipes. All the active pipes are located at the + beginning of the pipes array. + + + + + Index of the next bound pipe to read a message from. + + + + + If true, part of a multipart message was already received, but + there are following parts still waiting in the current pipe. + + + + + This gets called by ProcessPipeTermAck or XTerminated to respond to the termination of the given pipe. + + the pipe that was terminated + + + + List of outbound pipes. + + + + + Number of active pipes. All the active pipes are located at the + beginning of the pipes array. + + + + + Points to the last pipe that the most recent message was sent to. + + + + + True if last we are in the middle of a multipart message. + + + + + True if we are dropping current message. + + + + + This gets called by ProcessPipeTermAck or XTerminated to respond to the termination of the given pipe. + + the pipe that was terminated + + + + Multi-trie. Each node in the trie is a set of pointers to pipes. + + + + + Add key to the trie. Returns true if it's a new subscription + rather than a duplicate. + + + + + Remove all subscriptions for a specific peer from the trie. + If there are no subscriptions left on some topics, invoke the + supplied callback function. + + + + + + + + + Remove specific subscription from the trie. Return true is it was + actually removed rather than de-duplicated. + + + + + + + + Signal all the matching pipes. + + + + + Add key to the trie. Returns true if this is a new item in the trie + rather than a duplicate. + + + + + + + Remove key from the trie. Returns true if the item is actually + removed from the trie. + + + + + + + Check whether particular key is in the trie. + + + + + + + List of all subscriptions mapped to corresponding pipes. + + + + + Distributor of messages holding the list of outbound pipes. + + + + + If true, send all subscription messages upstream, not just + unique ones. The default is false. + + + + + + The default value is false. + + + + + True if we are in the middle of sending a multipart message. + + + + + True if we are in the middle of receiving a multipart message. + + + + + List of pending (un)subscriptions, ie. those that were already + applied to the trie, but not yet received by the user. + + + + + Register the pipe with this socket. + + the Pipe to attach + if true - subscribe to all data on the pipe + + + + Indicate the given pipe as being ready for reading by this socket. + + the Pipe that is now becoming available for reading + + + + Indicate the given pipe as being ready for writing to by this socket. + This gets called by the WriteActivated method. + + the Pipe that is now becoming available for writing + + + + Set the specified option on this socket. + + which option to set + the value to set the option to + true if successful + optionValue must be a byte-array. + + + + This is an override of the abstract method that gets called to signal that the given pipe is to be removed from this socket. + + the Pipe that is being removed + + + + Transmit the given message. The Send method calls this to do the actual sending. + + the message to transmit + true if the message was sent successfully + + + + Receive a message. The Recv method calls this lower-level method to do the actual receiving. + + the Msg to receive the message into + true if the message was received successfully, false if there were no messages to receive + + + + Fair queueing object for inbound pipes. + + + + + Object for distributing the subscriptions upstream. + + + + + The repository of subscriptions. + + + + + If true, 'message' contains a matching message to return on the + next recv call. + + + + + If true, part of a multipart message was already received, but + there are following parts still waiting. + + + + + Register the pipe with this socket. + + the Pipe to attach + not used + + + + Indicate the given pipe as being ready for reading by this socket. + + the Pipe that is now becoming available for reading + + + + Indicate the given pipe as being ready for writing to by this socket. + This gets called by the WriteActivated method. + + the Pipe that is now becoming available for writing + + + + This is an override of the abstract method that gets called to signal that the given pipe is to be removed from this socket. + + the Pipe that is being removed + + + + Transmit the given message. The Send method calls this to do the actual sending. + + the message to transmit + true if the message was sent successfully + + + + Receive a message. The Recv method calls this lower-level method to do the actual receiving. + + the Msg to receive the message into + true if the message was received successfully, false if there were no messages to receive + + + + A pipe is a ZObject with .. + + + Note that pipe can be stored in three different arrays. + The array of inbound pipes (1), the array of outbound pipes (2) and + the generic array of pipes to deallocate (3). + + + + + Indicate that the given pipe is now ready for reading. + Pipe calls this on it's sink in response to ProcessActivateRead. + When called upon an instance of SocketBase, this simply calls XReadActivated. + + the pipe to indicate is ready for reading + + + + This gets called by ProcessPipeTermAck or XTerminated to respond to the termination of the given pipe. + + the pipe that was terminated + + + + The underlying pipe for reading from. + + + + + The underlying pipe for writing to. + + + + + This indicates whether this pipe can be read from. + + + + + This indicates whether this pipe be written to. + + + + + High watermark for the outbound pipe. + + + + + Low watermark for the inbound pipe. + + + + + Number of messages read so far. + + + + + Number of messages written so far. + + + + + Last received peer's msgs_read. The actual number in the peer + can be higher at the moment. + + + + + The pipe object on the other side of the pipe-pair. + + + + + Sink to send events to. + + + + + Specifies the state of the pipe endpoint. + + + + Active is common state before any termination begins. + + + Delimited means that delimiter was read from pipe before term command was received. + + + Pending means that term command was already received from the peer but there are still pending messages to read. + + + Terminating means that all pending messages were already read and all we are waiting for is ack from the peer. + + + Terminated means that 'terminate' was explicitly called by the user. + + + Double_terminated means that user called 'terminate' and then we've got term command from the peer as well. + + + + If true, we receive all the pending inbound messages before terminating. + If false, we terminate immediately when the peer asks us to. + + + + + Identity of the writer. Used uniquely by the reader side. + + + + + Create a new Pipe object with the given parent, and inbound and outbound YPipes. + + + Constructor is private as pipe can only be created using method. + + + + + Create a pipe pair for bi-directional transfer of messages. + + The parents. + First HWM is for messages passed from first pipe to the second pipe. + Second HWM is for messages passed from second pipe to the first pipe. + First LWM is for messages passed from first pipe to the second pipe. + Second LWM is for messages passed from second pipe to the first pipe. + A pipe pair for bi-directional transfer of messages. + + + + Set the pipe to not delay termination, for sockets that don't process inbound messages, e.g PUSH, PUB + + + + + uses this function to let us know about the peer pipe object. + + The peer to be assigned. + + + + Specifies the object to send events to. + + The receiver of the events. + + + + Get or set the byte-array that comprises the identity of this Pipe. + + + + + Get or set the uint that comprises the routing id of this Pipe. + + + + + Checks if there is at least one message to read in the pipe. + + Returns true if there is at least one message to read in the pipe; false otherwise. + + + + Read a message from the underlying inbound pipe, and write it to the provided Msg argument. + + true if a message is read from the pipe, false if pipe is terminated or no messages are available + + + + Check whether messages can be written to the pipe. If writing + the message would cause high watermark the function returns false. + + true if message can be written to the pipe; false otherwise. + + + + Write a message to the underlying pipe. + + The message to write. + false if the message cannot be written because high watermark was reached. + + + + Remove unfinished parts of the outbound message from the pipe. + + + + + Flush the messages downstream. + + + + + This method is called to assign the specified pipe as a replacement for the outbound pipe that was being used. + + the pipe to use for writing + + A "Hiccup" occurs when an outbound pipe experiences something like a transient disconnect or for whatever other reason + is no longer available for writing to. + + + + + Process the pipe-termination ack. + + + + + Ask pipe to terminate. The termination will happen asynchronously + and user will be notified about actual deallocation by 'terminated' + event. + + if set to true, the pending messages will be processed + before actual shutdown. + + + + Compute an appropriate low watermark from the given high-watermark. + + the given high-watermark value to compute it from + predefined low watermark value coming from configuration + the computed low-watermark + + + + Handles the delimiter read from the pipe. + + + + + Temporarily disconnects the inbound message stream and drops + all the messages on the fly. Causes 'hiccuped' event to be generated in the peer. + + + + + Override the ToString method to return a string denoting the type and the parent. + + a string containing this type and also the value of the parent-property + + + + Class Reaper is a ZObject and implements IPollEvents. + The Reaper is dedicated toward handling socket shutdown asynchronously and cleanly. + By passing this task off to the Reaper, the message-queueing subsystem can terminate immediately. + + + + + Reaper thread accesses incoming commands via this mailbox. + + + + + This is a Socket, used as the handle associated with the mailbox's file descriptor. + + + + + I/O multiplexing is performed using a poller object. + + + + + Number of sockets being reaped at the moment. + These are the reason for having a reaper: to take over the task of terminating these sockets. + + + + + If true, we were already asked to terminate. + + + + + Create a new Reaper with the given thread-id. + This will have a new Poller with the name "reaper-" + thread-id, and a Mailbox of that same name. + + the Ctx for this to be in + an integer id to give to the thread this will live on + + + + Release any contained resources - by destroying the poller and closing the mailbox. + + + + + Get the Mailbox that this Reaper uses for communication with the rest of the message-queueing subsystem. + + + + + Start the contained Poller to begin polling. + + + + + Issue the Stop command to this Reaper object. + + + + + Handle input-ready events, by receiving and processing any commands + that are waiting in the mailbox. + + + + + This method normally is for handling output-ready events, which don't apply here. + + You must not call OutEvent on a Reaper. + + + + This would be called when a timer expires - however in this event NotSupportedException would be thrown. + + an integer used to identify the timer + You must not call TimerEvent on a Reaper. + + + + Respond to the Stop command by signaling the polling-loop to terminate, + and if there're no sockets left to reap - stop the poller. + + + + + Add the given socket to the list to be reaped (terminated). + + the socket to add to the list for termination + + + + Respond to having one of the sockets that are marked for reaping, - finished being reaped, + and if there are none left - send the Done command and stop the poller. + + + + + If true, this session (re)connects to the peer. Otherwise, it's + a transient session created by the listener. + + + + + Pipe connecting the session to its socket. + + + + + This set is added to with pipes we are disconnecting, but haven't yet completed + + + + + This flag is true if the remainder of the message being processed + is still in the pipe. + + + + + True if termination have been suspended to push the pending + messages to the network. + + + + + The protocol I/O engine connected to the session. + + + + + The socket the session belongs to. + + + + + I/O thread the session is living in. It will be used to plug in + the engines into the same thread. + + + + + ID of the linger timer (0x20) + + + + + True is linger timer is running. + + + + + Protocol and address to use when connecting. + + + + + Create a return a new session. + The specific subclass of SessionBase that is created is dictated by the SocketType specified by the options argument. + + the IOThread for this session to run in + whether to immediately connect + the socket to connect + an Options that provides the SocketType that dictates which type of session to create + an Address object that specifies the protocol and address to connect to + the newly-created instance of whichever subclass of SessionBase is specified by the options + The socket must be of the correct type. + + + + Create a new SessionBase object from the given IOThread, socket, and Address. + + the IOThread for this session to run on + this flag dictates whether to connect + the socket to contain + Options that dictate the settings of this session + an Address that dictates the protocol and IP-address to use when connecting + + + + Terminate and release any contained resources. + This cancels the linger-timer if that exists, and terminates the protocol-engine if that exists. + + + + + Attach the given pipe to this session. + + + This is to be used once only, when creating the session. + + + + + Read a message from the pipe. + + a reference to a Msg to put the message into + true if the Msg is successfully sent + + + + Write the given Msg to the pipe. + + the Msg to push to the pipe + true if the Msg was successfully sent + + + + Set the identity-sent and identity-received flags to false. + + + + + Flush any messages that are in the pipe downstream. + + + + + Remove any half processed messages. Flush unflushed messages. + Call this function when engine disconnect to get rid of leftovers. + + + + + This gets called by ProcessPipeTermAck or XTerminated to respond to the termination of the given pipe. + + the pipe that was terminated + + + + Indicate that the given pipe is now ready for reading. + Pipe calls this on it's sink in response to ProcessActivateRead. + + the pipe to indicate is ready for reading + + + + Get the contained socket. + + + + + Process the Plug-request by setting this SessionBase as the handler for the io-object + and starting connecting (without waiting). + + + + + Process the Attach-request by hooking up the pipes + and plugging in the given engine. + + the IEngine to plug in + + + + Flush out any leftover messages and call Detached. + + + + + Process a termination request. + + a time (in milliseconds) for this to linger before actually going away. -1 means infinite. + + + + Call this function to move on with the delayed process-termination request. + + + + + This is called when the timer expires. + + an integer used to identify the timer + + + + The parent SessionBase class calls this when the Detach method finishes detaching. + + + + + Begin connecting. + + Whether to wait a bit before actually attempting to connect + + + + Override the ToString method to also show the socket-id. + + the type of this object and [ socket-id ] + + + + This method would be called when a message receive operation has been completed, although here it only throws a NotSupportedException. + + a SocketError value that indicates whether Success or an error occurred + the number of bytes that were transferred + This operation is not supported on the SessionBase class. + + + + This method would be called when a message Send operation has been completed, although here it only throws a NotSupportedException. + + a SocketError value that indicates whether Success or an error occurred + the number of bytes that were transferred + This operation is not supported on the SessionBase class. + + + If true, associated context was already terminated. + + + + If true, object should have been already destroyed. However, + destruction is delayed while we unwind the stack to the point + where it doesn't intersect the object being destroyed. + + + + Socket's mailbox object. + + + List of attached pipes. + + + Reaper's poller. + + + The handle of this socket within the reaper's poller. + + + Timestamp of when commands were processed the last time. + + + Number of messages received since last command processing. + + + True if the last message received had MORE flag set. + + + Monitor socket. + + + Bitmask of events being monitored. + + + The tcp port that was bound to, if any. + + + + Indicate if the socket is thread safe + + + + + Mutex for synchronize access to the socket in thread safe mode + + + + + Signaler to be used in the reaping stage + + + + + Create a new SocketBase within the given Ctx, with the specified thread-id and socket-id. + + the Ctx context that this socket will live within + the id of the thread upon which this socket will execute + the integer id for the new socket + Indicate if the socket is thread-safe + + + + Abstract method for attaching a given pipe to this socket. + The concrete implementations are defined by the individual socket types. + + the Pipe to attach + if true - subscribe to all data on the pipe + + + + Abstract method that gets called to signal that the given pipe is to be removed from this socket. + The concrete implementations of SocketBase override this to provide their own implementation + of how to terminate the pipe. + + the Pipe that is being removed + + + Throw if this socket is already disposed. + This object is already disposed. + + + + Throw if the message-queueing system has started terminating. + + The socket has been stopped. + + + + Create a socket of a specified type. + + a ZmqSocketType specifying the type of socket to create + the parent context + the thread for this new socket to run on + an integer id for this socket + The socket type must be valid. + + + + Destroy this socket - which means to stop monitoring the queue for messages. + This simply calls StopMonitor, and then verifies that the destroyed-flag is set. + + + + + Return the Mailbox associated with this socket. + + + + + Interrupt a blocking call if the socket is stuck in one. + This function can be called from a different thread! + + + + + Check whether the transport protocol, as specified in connect or + bind, is available and compatible with the socket type. + + the specified protocol is not supported + the socket type and protocol do not match + + The supported protocols are "inproc", "ipc", "tcp", "pgm", and "epgm". + If the protocol is either "pgm" or "epgm", then this socket must be of type Pub, Sub, XPub, or XSub. + + + + + Register the given pipe with this socket. + + the Pipe to attach + if true - subscribe to all data on the pipe (optional - default is false) + + + + Set the specified socket option. + + which option to set + the value to set the option to + The socket has been stopped. + + + + Return the integer-value of the specified option. + + which option to get + the value of the specified option, or -1 if error + The socket has been stopped. + + If the ReceiveMore option is specified, then 1 is returned if it is true, 0 if it is false. + If the Events option is specified, then process any outstanding commands, and return -1 if that throws a TerminatingException. + then return an integer that is the bitwise-OR of the PollEvents.PollOut and PollEvents.PollIn flags. + Otherwise, cast the specified option value to an integer and return it. + + + + + Return the value of the specified option as an Object. + + which option to get + the value of the option + The socket has already been stopped. + + If the Handle option is specified, then return the handle of the contained mailbox. + If the Events option is specified, then process any outstanding commands, and return -1 if that throws a TerminatingException. + then return a PollEvents that is the bitwise-OR of the PollEvents.PollOut and PollEvents.PollIn flags. + + + + + Join the dish socket to a group + + The group to join + + + + Leave a group for a dish socket + + The group leave + + + + Bind this socket to the given address. + + a string denoting the endpoint-address to bind to + the address specified to bind to must not be already in use + The requested protocol is not supported. + the socket bind failed + No IO thread was found, or the protocol's listener encountered an + error during initialisation. + the specified protocol is not supported + the socket type and protocol do not match + The socket has been stopped. + + The supported protocols are "inproc", "ipc", "tcp", "pgm", and "epgm". + If the protocol is either "pgm" or "epgm", then this socket must be of type Pub, Sub, XPub, or XSub. + If the protocol is "inproc", you cannot bind to the same address more than once. + + + + Bind the specified TCP address to an available port, assigned by the operating system. + a string denoting the endpoint to bind to + the port-number that was bound to + uses a protocol other than TCP. + The socket has been stopped. + The specified address is already in use. + No IO thread was found, or the protocol's listener errored during + initialisation. + the socket bind failed + + + + Connect this socket to the given address. + + a string denoting the endpoint to connect to + The specified address is already in use. + No IO thread was found. + the specified protocol is not supported + the socket type and protocol do not match + The socket has been stopped. + + The supported protocols are "inproc", "ipc", "tcp", "pgm", and "epgm". + If the protocol is either "pgm" or "epgm", then this socket must be of type Pub, Sub, XPub, or XSub. + + The given address was not found in the list of endpoints. + + + + Given a string containing an endpoint address like "tcp://127.0.0.1:5555, + break-it-down into the address part ("127.0.0.1:5555") and the protocol part ("tcp"). + + a string denoting the endpoint, to take the parts from + the IP-address portion of the end-point address + the protocol portion of the end-point address (such as "tcp") + + + + Take ownership of the given and register it against the given . + + + + + Disconnect from the given endpoint. + + the endpoint to disconnect from + is null. + Endpoint was not found and cannot be disconnected. + The specified protocol must be valid. + The socket has been stopped. + + + + Transmit the given Msg across the message-queueing system. + + The to send. + The timeout to wait before returning false. Pass to disable timeout. + Whether this message will contain another frame after this one. + The socket has been stopped. + is not initialised. + + + + Receive a frame into the given and return true if successful, false if it timed out. + + the Msg to read the received message into + this controls whether the call blocks, and for how long. + The token to monitor for cancellation requests. The default value is . + true if successful, false if it timed out + + For , there are three categories of value: + + - return false immediately if no message is available + (or a negative value) - wait indefinitely, always returning true + Any positive value - return false after the corresponding duration if no message has become available + + + the Msg must already have been uninitialised + The socket must not already be stopped. + + + + Close this socket. Mark it as disposed, and send ownership of it to the reaper thread to + attend to the rest of it's shutdown process. + + + + + These functions are used by the polling mechanism to determine + which events are to be reported from this socket. + + + + + These functions are used by the polling mechanism to determine + which events are to be reported from this socket. + + + + + Using this function reaper thread ask the socket to register with + its poller. + + + + + Processes commands sent to this socket (if any). + If is -1, the call blocks until at least one command was processed. + If is true, commands are processed at most once in a predefined time period. + + how much time to allow to wait for a command, before returning (in milliseconds) + if true - throttle the rate of command-execution by doing only one per call + allows the caller to cancel the process commands operation + The Ctx context must not already be terminating. + + + + Process a termination command on this socket, by stopping monitoring and marking this as terminated. + + + + + Process a Bind command by attaching the given Pipe. + + the Pipe to attach + + + + Process a termination request. + + a time (in milliseconds) for this to linger before actually going away. -1 means infinite. + + + + Mark this socket as having been destroyed. Delay actual destruction of the socket. + + + + + The default implementation assumes there are no specific socket + options for the particular socket type. If not so, overload this + method. + + a ZmqSocketOption specifying which option to set + an Object that is the value to set the option to + + + + This gets called when outgoing messages are ready to be sent out. + On SocketBase, this does nothing and simply returns false. + + this method on SocketBase only returns false + + + + Transmit the given message. The method calls this to do the actual sending. + This abstract method gets overridden by the different socket types + to provide their concrete implementation of sending messages. + + the message to transmit + true if the message was sent successfully + + + + This gets called when incoming messages are ready to be received. + On SocketBase, this does nothing and simply returns false. + + this method on SocketBase only returns false + + + + Receive a message. The Recv method calls this lower-level method to do the actual receiving. + This abstract method gets overridden by the different socket types + to provide their concrete implementation of receiving messages. + + the Msg to receive the message into + true if the message was received successfully, false if there were no messages to receive + + + + Indicate the given pipe as being ready for reading by this socket. + This abstract method gets overridden by the different sockets + to provide their own concrete implementation. + + the Pipe that is now becoming available for reading + + + + Indicate the given pipe as being ready for writing to by this socket. + This abstract method gets called by the WriteActivated method + and gets overridden by the different sockets + to provide their own concrete implementation. + + the Pipe that is now becoming available for writing + + + + Handle input-ready events by receiving and processing any incoming commands. + + + + + Handle output-ready events. + + This is not supported on instances of the parent class SocketBase. + + + + In subclasses of SocketBase this is overridden, to handle the expiration of a timer. + + an integer used to identify the timer + You must not call TimerEvent on an instance of class SocketBase. + + + + To be called after processing commands or invoking any command + handlers explicitly. If required, it will deallocate the socket. + + + + + Indicate that the given pipe is now ready for reading. + Pipe calls this on it's sink in response to ProcessActivateRead. + When called upon an instance of SocketBase, this simply calls XReadActivated. + + the pipe to indicate is ready for reading + + + + When called upon an instance of SocketBase, this simply calls XWriteActivated. + + the pipe to indicate is ready for writing + + + + This gets called by ProcessPipeTermAck or XTerminated to respond to the termination of the given pipe. + + the pipe that was terminated + + + + Moves the flags from the message to local variables, + to be later retrieved by getsockopt. + + + + + Register the given events to monitor on the given endpoint. + + a string denoting the endpoint to monitor. If this is null - monitoring is stopped. + the SocketEvent to monitor for + Maximum number of sockets reached. + The protocol of is not supported. + The socket has been stopped. + + + + If there is a monitor-socket, close it and set monitor-events to 0. + + + + + Override the ToString method in order to also show the socket-id. + + A string that denotes this object type followed by [ socket-id ] + + + + Get the Socket (Handle) - which is actually the Handle of the contained mailbox. + + + + + Return a short bit of text that denotes the SocketType of this socket. + + a short type-string such as PAIR, PUB, OR UNKNOWN + + + + The class ByteArraySegment provides for containing a simple byte-array, an Offset property, + and a variety of operations that may be performed upon it. + + + + + Create a new ByteArraySegment containing the given byte-array buffer. + + the byte-array for the new ByteArraySegment to contain + + + + Create a new ByteArraySegment containing the given byte-array buffer with the given offset. + + the byte-array for the new ByteArraySegment to contain + the value for the Offset property + + + + Create a new ByteArraySegment that is a shallow-copy of the given ByteArraySegment (with a reference to the same buffer). + + the source-ByteArraySegment to make a copy of + + + + Create a new ByteArraySegment that is a shallow-copy of the given ByteArraySegment (with a reference to the same buffer) + but with a different offset. + + the source-ByteArraySegment to make a copy of + a value for the Offset property that is distinct from that of the source ByteArraySegment + + + + Get the number of bytes within the buffer that is past the Offset (ie, buffer-length minus offset). + + + + + Add the given value to the offset. + + the delta value to add to the offset. + + + + Get the offset into the buffer. + + + + + Write the given 64-bit value into the buffer, at the position marked by the offset plus the given index i. + + an Endianness to specify in which order to write the bytes + the 64-bit value to write into the byte-array buffer + the index position beyond the offset to start writing the bytes + + + + Write the given 16-bit value into the buffer, at the position marked by the offset plus the given index i. + + an Endianness to specify in which order to write the bytes + the 16-bit value to write into the byte-array buffer + the index position beyond the offset to start writing the bytes + + + + Write the given 32-bit value into the buffer, at the position marked by the offset plus the given index i. + + an Endianness to specify in which order to write the bytes + the 32-bit value to write into the byte-array buffer + the index position beyond the offset to start writing the bytes + + + + Encode the given String into a byte-array using the ASCII encoding + and write that into the buffer. + + the String to write to the buffer + the number of encoded bytes to copy into the buffer + an index-offset, in addition to the Offset property, that marks where in the buffer to start writing bytes to + + + + Encode the given String into a byte-array using the ASCII encoding + and write that into the buffer. + + the String to write to the buffer + an index-offset, in addition to the Offset property, that marks where in the buffer to start writing bytes to + + + + Return a 64-bit numeric value that is read from the buffer, starting at the position marked by the offset plus the given index i, + based upon the given byte-ordering. + + an Endianness to specify which byte-ordering to use to interpret the source bytes + the index position beyond the offset to start reading the bytes + a long that is read from the bytes of the buffer + + + + Return a 64-bit unsigned numeric value (ulong) that is read from the buffer, starting at the position marked by the offset plus the given index i, + based upon the given byte-ordering. + + an Endianness to specify which byte-ordering to use to interpret the source bytes + the index position beyond the offset to start reading the bytes + an unsigned long that is read from the bytes of the buffer + + + + Return a 32-bit integer that is read from the buffer, starting at the position marked by the offset plus the given index i, + based upon the given byte-ordering. + + an Endianness to specify which byte-ordering to use to interpret the source bytes + the index position beyond the offset to start reading the bytes + an integer that is read from the bytes of the buffer + + + + Return a 16-bit unsigned integer (ushort) value that is read from the buffer, starting at the position marked by the offset plus the given index i, + based upon the given byte-ordering. + + an Endianness to specify which byte-ordering to use to interpret the source bytes + the index position beyond the offset to start reading the bytes + a ushort that is read from the bytes of the buffer + + + + Return a String that is read from the byte-array buffer, decoded using the ASCII encoding, + starting at the position marked by the offset plus the given index i. + + the length of the part of the buffer to read + the index position beyond the offset to start reading the bytes + a String decoded from the bytes of the buffer + + + + Write the bytes of this ByteArraySegment to the specified destination-ByteArraySegment. + + the destination-ByteArraySegment + the number of bytes to copy + + + + Write the bytes of this ByteArraySegment to the specified destination-ByteArraySegment. + + an offset within this source buffer to start copying from + the destination-ByteArraySegment + an offset within the destination buffer to start copying to + the number of bytes to copy + + + + Return a shallow-copy of this ByteArraySegment. + + a new ByteArraySegment that is a shallow-copy of this one + + + + Get or set the byte of the buffer at the i-th index position (zero-based). + + the index of the byte to access + + + + Set the offset to zero. + + + + + Return a new ByteArraySegment that has the data of this one, but with the given offset. + + the source-ByteArraySegment + the offset-value to give the new ByteArraySegment + + + + + Return a new ByteArraySegment that contains the given byte-array buffer. + + the source byte-array buffer + a new ByteArraySegment that contains the given buffer + + + + Return the byte-array buffer of this ByteArraySegment. + + the source-ByteArraySegment + the byte-array that is the buffer of this ByteArraySegment + + + + Return true if the given Object is a ByteArraySegment and has the same buffer and offset. + + an Object to compare for equality to this one + true only if the otherObject has the same buffer and offset + + The given Object is considered to be Equal if it also is a ByteArraySegment, + and has the same Offset property value + and it's buffer points to the SAME byte-array as the otherObject does. + + + + + Helper base class for decoders that know the amount of data to read + in advance at any moment. + This class is the state machine that parses the incoming buffer. + Derived classes should implement individual state machine actions. + + + Knowing the amount in advance is a property + of the protocol used. 0MQ framing protocol is based size-prefixed + paradigm, which qualifies it to be parsed by this class. + + On the other hand, XML-based transports (like XMPP or SOAP) don't allow + for knowing the size of data to read in advance and should use different + decoding algorithms. + + + + + Where to store the read data. + + + + + How much data to read before taking next step. + + + + + The buffer for data to decode. + + + + + Returns a buffer to be filled with binary data. + + + + + Processes the data in the buffer previously allocated using + GetBuffer function. size argument specifies the number of bytes + actually filled into the buffer. + + + + + Where to get the data to write from. + + + + + How much data to write before the next step should be executed. + + + + + The buffer for encoded data. + + + + + The size of the encoded-data buffer + + + + + Create a new EncoderBase with a buffer of the given size. + + how big of an internal buffer to allocate (in bytes) + the to set this EncoderBase to + + + + Get the Endianness (Big or Little) that this EncoderBase uses. + + + + + Interface IEncoder mandates SetMsgSource and GetData methods. + + + + + Get a ByteArraySegment of binary data. The data + are filled to a supplied buffer. If no buffer is supplied (data is null) + encoder will provide buffer of its own. + + Returns data size or 0 when a new message is required + + + + Load a new message into encoder. + + + + + + Abstract interface to be implemented by various engines. + + + + + Plug the engine to the session. + + + + + Terminate and deallocate the engine. Note that 'detached' + events are not fired on termination. + + + + + This method is called by the session to signal that more + messages can be written to the pipe. + + + + + This method is called by the session to signal that there + are messages to send available. + + + + + IpcConnecter is a subclass of TcpConnector, which provides absolutely nothing beyond what TcpConnector does. + + + + + An IpcListener is a TcpListener that also has an Address property and a SetAddress method. + + + + + Create a new IpcListener with the given IOThread, socket, and Options. + + + the SocketBase to listen to + an Options value that dictates the settings for this IpcListener + + + + Get the bound address for use with wildcards + + + + + Set address to listen on. + + a string denoting the address to listen to + + + Unable to parse the address's port number, or the IP address could not be parsed. + + + Unable to parse the address's port number, or the IP address could not be parsed. + + + Unable to parse the address's port number, or the IP address could not be parsed. + Error establishing underlying socket. + + + + Process a termination request. + + a time (in milliseconds) for this to linger before actually going away. -1 means infinite. + + + + This method is called when a message receive operation has been completed. + + a SocketError value that indicates whether Success or an error occurred + the number of bytes that were transferred + + + + This method would be called when a message Send operation has been completed, although here it only throws a NotSupportedException. + + a SocketError value that indicates whether Success or an error occurred + the number of bytes that were transferred + This operation is not supported on the PgmListener class. + + + + This would be called when the a expires, although here it only throws a NotSupportedException. + + an integer used to identify the timer (not used here) + This operation is not supported on the PgmListener class. + + + + ID of the timer used to delay the reconnection. Value is 1. + + + + + This would be called when a timer expires, although here it only throws a NotSupportedException. + + an integer used to identify the timer (not used here) + This method must not be called on instances of PgmSender. + + + + This method is called when a message Send operation has been completed. + + a SocketError value that indicates whether Success or an error occurred + the number of bytes that were transferred + A non-recoverable socket error occurred. + + + + Internal function to return a reconnect back-off delay. + Will modify the current_reconnect_ivl used for next call + Returns the currently used interval + + + + + This method would be called when a message receive operation has been completed, although here it only throws a NotSupportedException. + + a SocketError value that indicates whether Success or an error occurred + the number of bytes that were transferred + This method must not be called on instances of PgmSender. + + + + This enum-type is Idle, Receiving, Stuck, or Error. + + + + + This method is be called when a message receive operation has been completed. + + a SocketError value that indicates whether Success or an error occurred + the number of bytes that were transferred + + + + This method would be called when a message Send operation has been completed, except in this case this method does nothing. + + a SocketError value that indicates whether Success or an error occurred + the number of bytes that were transferred + + + + This would be called when a timer expires, although here it does nothing. + + an integer used to identify the timer (not used here) + + + + This enum-type denotes the type of Pragmatic General Multicast (PGM) socket. + Publisher, Receiver, or Listener. + + + + + A PgmSocket utilizes the Pragmatic General Multicast (PGM) multicast protocol, which is also referred to as "reliable multicast". + This is only supported on Windows when Microsoft Message Queueing (MSMQ) is installed. + See RFC 3208. + + + + + Set/Query rate (Kb/Sec) + window size (Kb and/or MSec) -- described by RM_SEND_WINDOW below + + + + + set IP multicast outgoing interface + + + + + add IP multicast incoming interface + + + + + Set the Time-To-Live (TTL) of the MCast packets -- (ULONG) + + + + + Perform initialization of this PgmSocket, including creating the socket handle. + + + + + Override the ToString method to produce a more descriptive, useful description. + + a useful description of this object's state + + + + This enum-type denotes the operational state of this StreamEngine - whether Closed, doing Handshaking, Active, or Stalled. + + + + + This method is be called when a message receive operation has been completed. + + a SocketError value that indicates whether Success or an error occurred + the number of bytes that were transferred + + + + This method is called when a message Send operation has been completed. + + a SocketError value that indicates whether Success or an error occurred + the number of bytes that were transferred + + + the SocketError that resulted from the write - which could be Success (no error at all) + this indicates the number of bytes that were transferred in the write + the number of bytes transferred if successful, -1 otherwise + If the socketError is not Success then it must be a valid recoverable error or the number of bytes transferred must be zero. + + If socketError is SocketError.Success and bytesTransferred is > 0, then this returns bytesTransferred. + If bytes is zero, or the socketError is one of NetworkDown, NetworkReset, HostUn, Connection Aborted, TimedOut, ConnectionReset, AccessDenied, or Shutdown, - then -1 is returned. + Otherwise, a NetMQException is thrown. + + + + the SocketError that resulted from the read - which could be Success (no error at all) + this indicates the number of bytes that were transferred in the read + the number of bytes transferred if successful, -1 otherwise + If the socketError is not Success then it must be a valid recoverable error or the number of bytes transferred must be zero. + + If socketError is SocketError.Success and bytesTransferred is > 0, then this returns bytesTransferred. + If bytes is zero, or the socketError is one of NetworkDown, NetworkReset, HostUn, Connection Aborted, TimedOut, ConnectionReset, AccessDenied, or Shutdown, - then -1 is returned. + Otherwise, a NetMQException is thrown. + + + + + This would be called when a timer expires, although here it only throws NotSupportedException. + + an integer used to identify the timer (not used here) + TimerEvent is not supported on StreamEngine. + + + + A TcpAddress implements IZAddress, and contains an IPEndPoint (the Address property) + and a Protocol property. + + + + + Override ToString to provide a detailed description of this object's state + in the form: Protocol://[AddressFamily]:Port + + a string in the form Protocol://[AddressFamily]:Port + + + + Given a string that should identify an endpoint-address, resolve it to an actual IP address + and set the Address property to a valid corresponding value. + + the endpoint-address to resolve + whether the address must be only-IPv4 + The name must contain the colon delimiter. + The specified port must be a valid nonzero integer. + Must be able to find the IP-address. + + + + Get the Address implementation - which here is an IPEndPoint, + which contains Address, AddressFamily, and Port properties. + + + + + Get the textual-representation of the communication protocol implied by this TcpAddress, + which here is simply "tcp". + + + + + If 'delay' is true connector first waits for a while, then starts connection process. + + + + + ID of the timer used to delay the reconnection. Value is 1. + + + + + Address to connect to. Owned by session_base_t. + + + + + The underlying AsyncSocket. + + + + + If true file descriptor is registered with the poller and 'handle' + contains valid value. + + + + + If true, connector is waiting a while before trying to connect. + + + + + True if a timer has been started. + + + + + Reference to the session we belong to. + + + + + Current reconnect-interval. This gets updated for back-off strategy. + + + + + String representation of endpoint to connect to + + + + + Socket + + + + + Create a new TcpConnector object. + + the I/O-thread for this TcpConnector to live on. + the session that will contain this + Options that define this new TcpC + the Address for this Tcp to connect to + this boolean flag dictates whether to wait before trying to connect + + + + This does nothing. + + + + + Begin connecting. If a delayed-start was specified - then the reconnect-timer is set, otherwise this starts immediately. + + + + + Process a termination request. + This cancels the reconnect-timer, closes the AsyncSocket, and marks the socket-handle as invalid. + + a time (in milliseconds) for this to linger before actually going away. -1 means infinite. + + + + This method would be called when a message receive operation has been completed, although here it only throws a NotImplementedException. + + a SocketError value that indicates whether Success or an error occurred + the number of bytes that were transferred + InCompleted must not be called on a TcpConnector. + + + + Internal function to start the actual connection establishment. + + + + + This method is called when a message Send operation has been completed. + + a SocketError value that indicates whether Success or an error occurred + the number of bytes that were transferred + A non-recoverable socket error occurred. + If the socketError is not Success then it must be a valid recoverable error. + + + + This is called when the timer expires - to start trying to connect. + + The timer-id. This is not used. + + + + Internal function to add a reconnect timer + + + + + Internal function to return a reconnect back-off delay. + Will modify the current_reconnect_ivl used for next call + Returns the currently used interval + + + + + Close the connecting socket. + + + + + Address to listen on. + + + + + Underlying socket. + + + + + Socket the listener belongs to. + + + + + String representation of endpoint to bind to + + + + + The port that was bound on + + + + + Create a new TcpListener on the given IOThread and socket. + + the IOThread for this to live within + a SocketBase to listen on + socket-related Options + + + + Release any contained resources (here - does nothing). + + + + + Process a termination request. + + a time (in milliseconds) for this to linger before actually going away. -1 means infinite. + + + + Set address to listen on. + + a string denoting the address to set this to + + + + This is called when socket input has been completed. + + This indicates the status of the input operation - whether Success or some error. + the number of bytes that were transferred + A non-recoverable socket-error occurred. + + + + Close the listening socket. + + + + + Get the bound address for use with wildcards + + + + + Get the port-number to listen on. + + + + + This method would be called when a message Send operation has been completed - except in this case it simply throws a NotImplementedException. + + a SocketError value that indicates whether Success or an error occurred + the number of bytes that were transferred + OutCompleted is not implemented on TcpListener. + + + + This would be called when a timer expires, although here it only throws a NotSupportedException. + + an integer used to identify the timer (not used here) + TimerEvent is not supported on TcpListener. + + + + The maximum message-size. If this is -1 then there is no maximum. + + + + + Create a new V1Decoder with the given buffer-size, maximum-message-size and Endian-ness. + + the buffer-size to give the contained buffer + the maximum message size. -1 indicates no limit. + the Endianness to specify for it - either Big or Little + + + + Encoder for 0MQ framing protocol. Converts messages into data stream. + + + + + V2Protocol is a class that contains two integer constants: MoreFlag and LargeFlag. + + + + + This is a constant-integer with the value 1. + + + + + This is a constant-integer with the value 2. + + + + + This class simply provides a counter-value, which may be set, increased, and decremented. + Increase and Decrement are both thread-safe operations. + + + + + Create a new AtomicCounter object with an initial counter-value of zero. + + + + + Assign the given amount to the counter-value. + + the integer value to set the counter to + + + + Add the given amount to the counter-value, in an atomic thread-safe manner. + + the integer amount to add to the counter-value + + + + Subtract the given amount from the counter-value, in an atomic thread-safe manner. + + the integer amount to subtract from to the counter-value (default value is 1) + the new value of the counter + + + + Class ByteArrayEqualityComparer is an IEqualityComparer for byte-arrays, + and provides an Equals methods to compare two byte-arrays for equality in value + and GetHashCode. + + + + + Return true only if the two byte-arrays are equal in length and contain the same values. + + one of the two byte-arrays to compare + the other byte-array to compare against + + + + + Return a numeric hashcode of the given byte-array. + + the given byte-array to compute the hashcode of + an integer that contains a hashcode computed over the byte-array + + + + The Clock class provides properties for getting timer-counts in either milliseconds or microseconds, + and the CPU's timestamp-counter if available. + + + + + TSC timestamp of when last time measurement was made. + + + + + Physical time corresponding to the TSC above (in milliseconds). + + + + + This flag indicates whether the rdtsc instruction is supported on this platform. + + + + + Return the High-Precision timestamp, as a 64-bit integer that denotes microseconds. + + + + + Return the Low-Precision timestamp, as a 64-bit integer denoting milliseconds. + In tight loops generating it can be 10 to 100 times faster than the High-Precision timestamp. + + + + + Return the CPU's timestamp counter, or 0 if it's not available. + + + + + A PollSet contains a single Socket and an IPollEvents Handler + that provides methods that signal when that socket is ready for reading or writing. + + + + + Get the Socket that this PollSet contains. + + + + + Get the IPollEvents object that has methods to signal when ready for reading or writing. + + + + + Get or set whether this PollSet is cancelled. + + + + + Create a new PollSet object to hold the given Socket and IPollEvents handler. + + the Socket to contain + the IPollEvents to signal when ready for reading or writing + + + + This is the list of registered descriptors (PollSets). + + + + + List of sockets to add at the start of the next loop + + + + + If true, there's at least one retired event source. + + + + + This flag is used to tell the polling-loop thread to shut down, + wherein it will stop at the end of it's current loop iteration. + + + + + This indicates whether the polling-thread is not presently running. Default is true. + + + + + This is the background-thread that performs the polling-loop. + + + + + This is the name associated with this Poller. + + + + + The set of Sockets to check for read-readiness. + + + + + The set of Sockets to check for any errors. + + + + + Create a new Poller object with the given name. + + a name to assign to this Poller + + + + Unless the polling-loop is already stopped, + tell it to stop at the end of the current polling iteration, and wait for that thread to finish. + + + + + Add a new PollSet containing the given Socket and IPollEvents at the next iteration through the loop, + and also add the Socket to the list of those to check for errors. + + the Socket to add + the IPollEvents to include in the new PollSet to add + + + + Remove the given Socket from this Poller. + + the System.Net.Sockets.Socket to remove + + + + Add the given Socket to the list to be checked for read-readiness at each poll-iteration. + + the Socket to add + + + + Begin running the polling-loop, on a background thread. + + + The name of that background-thread is the same as the name of this Poller object. + + + + + Signal that we want to stop the polling-loop. + This method returns immediately - it does not wait for the polling thread to stop. + + + + + This method is the polling-loop that is invoked on a background thread when Start is called. + As long as Stop hasn't been called: execute the timers, and invoke the handler-methods on each of the saved PollSets. + + + + + This serves as the parent-class for Poller and Proactor. + It provides for managing a list of timers (ITimerEvents) - adding, cancelling, and executing them, + and a Load property. + + + + + Load of the poller. Currently the number of file descriptors registered. + + + + + Instances of this class contain a ITimerEvent sink and an integer Id. + + + + + Create a new TimerInfo object from the given sink and id. + + an ITimerEvent that acts as a sink for when the timer expires + an integer id that identifies this timer + + + + Get the ITimerEvent that serves as the event-sink. + + + + + Get the integer Id of this TimerInfo. + + + + + This is a list of key/value pairs, with the keys being timeout numbers and the corresponding values being a list of TimerInfo objects. + It is sorted by the keys - which are timeout values. Thus, by walking down the list, you encounter the soonest timeouts first. + + + + + Create a new PollerBase object - which simply creates an empty m_timers collection. + + + + + Get the load of this poller. Note that this function can be + invoked from a different thread! + + + + + Add the given amount to the load. + This is called by individual poller implementations to manage the load. + + + This is thread-safe. + + + + + Add a to the internal list, created from the given sink and id - to expire in the given number of milliseconds. + Afterward the expiration method TimerEvent on the sink object will be called with argument set to id. + + the timeout-period in milliseconds of the new timer + the IProactorEvents to add for the sink of the new timer + the Id to assign to the new TimerInfo + + + + Cancel the timer that was created with the given sink object with the given Id. + + the ITimerEvent that the timer was created with + the Id of the timer to cancel + + The complexity of this operation is O(n). We assume it is rarely used. + + + + + Execute any timers that are due. Return the number of milliseconds + to wait to match the next timer or 0 meaning "no timers". + + the time to wait for the next timer, in milliseconds, or zero if there are no more timers + + + The completionStatuses item must have a valid OperationType. + + + + Close the read and write sockets. + + + + + This class exists only to provide a wrapper for the Socket.Select method, + such that the call may be handled slightly differently on .NET 3.5 as opposed to later versions. + + + + + Determine the status of one or more sockets. + After returning, the lists will be filled with only those sockets that satisfy the conditions. + + a list of Sockets to check for readability + a list of Sockets to check for writability + a list of Sockets to check for errors + a timeout value, in microseconds. A value of -1 indicates an infinite timeout. + + If you are in a listening state, readability means that a call to Accept will succeed without blocking. + If you have already accepted the connection, readability means that data is available for reading. In these cases, + all receive operations will succeed without blocking. Readability can also indicate whether the remote Socket + has shut down the connection - in which case a call to Receive will return immediately, with zero bytes returned. + + Select returns when at least one of the sockets of interest (ie any of the sockets in the checkRead, checkWrite, or checkError + lists) meets its specified criteria, or the microSeconds parameter is exceeded - whichever comes first. + Setting microSeconds to -1 specifies an infinite timeout. + + If you make a non-blocking call to Connect, writability means that you have connected successfully. If you already + have a connection established, writability means that all send operations will succeed without blocking. + If you have made a non-blocking call to Connect, the checkError parameter identifies sockets that have not connected successfully. + + See this reference for further details of the operation of the Socket.Select method: + https://msdn.microsoft.com/en-us/library/system.net.sockets.socket.select(v=vs.110).aspx + + This may possibly throw an ArgumentNullException, if all three lists are null or empty, + and a SocketException if an error occurred when attempting to access a socket. + + Use the Poll method if you only want to determine the status of a single Socket. + + This method cannot detect certain kinds of connection problems, + such as a broken network cable, or that the remote host was shut down ungracefully. + You must attempt to send or receive data to detect these kinds of errors. + + none of the three lists of sockets may be null. + an error occurred when attempting to access the socket. + + + + StringLib is a static class whose purpose is to provide miscellaneous string-related utility methods + and extension properties. + + + + + Return a string that gives detailed information of the state of the given List of Sockets, + for debugging purposes. + + the List of Sockets to describe + a string detailing the list contents, including the state of each Socket + + This is intended just for debugging purposes, as when adding detailed information to the Message of an + exception when an error occurs. In DEBUG mode more detail is provided. + + + + + Return a detailed textual description of the state of this Socket (if DEBUG is defined). + + the System.Net.Sockets.Socket to describe + a string containing a detailed listing of the properties of the Socket + + This is intended just for debugging purposes, as when adding detailed information to the Message of an + exception when an error occurs. In DEBUG mode more detail is provided. + + + + A FIFO queue. + + The class supports: + + Push-front via . + Pop-back via . + Pop-front via . + + As such it is only one operation short of being a double-ended queue (dequeue or deque). + + The internal implementation consists of a doubly-linked list of fixed-size arrays. + + + + + Individual memory chunk to hold N elements. + + + Contains global index positions of elements in the chunk. + + + Optional link to the previous . + + + Optional link to the next . + + + the size to give the new YQueue + should be no less than 2 + + + Gets the index of the front element of the queue. + The index of the front element of the queue. + If the queue is empty, it should be equal to . + + + Gets the front element of the queue. If the queue is empty, behaviour is undefined. + The front element of the queue. + + + Gets the index of the back element of the queue. + The index of the back element of the queue. + If the queue is empty, it should be equal to . + + + Retrieves the element at the front of the queue. + The element taken from queue. + + + Adds an element to the back end of the queue. + The value to be pushed. + + + Removes element from the back end of the queue, rolling back the last call to . + The caller must guarantee that the queue isn't empty when calling this method. + It cannot be done automatically as the read side of the queue can be managed by different, + completely unsynchronized threads. + The last item passed to . + + + + Allocation-efficient queue to store pipe items. + Front of the queue points to the first prefetched item, back of + the pipe points to last un-flushed item. Front is used only by + reader thread, while back is used only by writer thread. + + + + + Points to the first un-flushed item. This variable is used + exclusively by writer thread. + + + + + Points to the first un-prefetched item. This variable is used + exclusively by reader thread. + + + + + Points to the first item to be flushed in the future. + + + + + The single point of contention between writer and reader thread. + Points past the last flushed item. If it is NULL, + reader is asleep. This pointer should be always accessed using + atomic operations. + + + + + Write an item to the pipe. Don't flush it yet. If incomplete is + set to true the item is assumed to be continued by items + subsequently written to the pipe. Incomplete items are never + flushed down the stream. + + + + + Pop an incomplete item from the pipe. + + the element revoked if such item exists, null otherwise. + + + + Flush all the completed items into the pipe. + + Returns false if the reader thread is sleeping. In that case, caller is obliged to + wake the reader up before using the pipe again. + + + + + Check whether item is available for reading. + + + + + Attempts to read an item from the pipe. + + true if the read succeeded, otherwise false. + + + + Applies the function fn to the first element in the pipe + and returns the value returned by the fn. + The pipe mustn't be empty or the function crashes. + + + + + This enum-type serves to identity a particular socket-option. + + + + + The I/O-thread affinity. + 0 means no affinity, meaning that work shall be distributed fairly among all I/O threads. + For non-zero values, the lowest bit corresponds to thread 1, second lowest bit to thread 2, and so on. + + + The I/O-thread Affinity is a 64-bit value used to specify which threads from the I/O thread-pool + associated with the socket's context shall handle newly-created connections. + 0 means no affinity, meaning that work shall be distributed fairly among all I/O threads. + For non-zero values, the lowest bit corresponds to thread 1, second lowest bit to thread 2, and so on. + + + + + The unique identity of the socket, from a message-queueing router's perspective. + + + This is at most 255 bytes long. + + + + + Setting this option subscribes a socket to messages that have the given topic. This is valid only for Subscriber and XSubscriber sockets. + + + You subscribe a socket to a given topic when you want that socket to receive messages of that topic. + A topic is simply a specific prefix (in the form of a byte-array or the equivalent text). + This is valid only for Subscriber and XSubscriber sockets. + + + + + Set this option to un-subscribe a socket from a given topic. Only for Subscriber and XSubscriber sockets. + + + You un-subscribe a socket from the given topic when you no longer want that socket to receive + messages of that topic. A topic is simply a specific prefix (in the form of a byte-array or the equivalent text). + This is valid only for Subscriber and XSubscriber sockets. + + + + + The maximum send or receive data rate for multicast transports on the specified socket. + + + + + The recovery-interval, in milliseconds, for multicast transports using the specified socket. + Default is 10,000 ms (10 seconds). + + + This option determines the maximum time that a receiver can be absent from a multicast group + before unrecoverable data loss will occur. Default is 10,000 ms (10 seconds). + + + + + The size of the transmit buffer for the specified socket. + + + + + The size of the receive buffer for the specified socket. + + + + + This indicates more messages are to be received. + + + + + The file descriptor associated with the specified socket. + + + + + The event state for the specified socket. + This is a combination of: + PollIn - at least one message may be received without blocking + PollOut - at least one messsage may be sent without blocking + + + + + This option specifies the linger period for the specified socket, + which determines how long pending messages which have yet to be sent to a peer + shall linger in memory after a socket is closed. + + + + + The initial reconnection interval for the specified socket. + -1 means no reconnection. + + + This is the period to wait between attempts to reconnect disconnected peers + when using connection-oriented transports. + A value of -1 means no reconnection. + + + + + This is the maximum length of the queue of outstanding peer connections + for the specified socket. This only applies to connection-oriented transports. + Default is 100. + + + + + The maximum reconnection interval for the specified socket. + The default value of zero means no exponential backoff is performed. + + + This option value denotes the maximum reconnection interval for a socket. + It is used when a connection drops and NetMQ attempts to reconnect. + On each attempt to reconnect, the previous interval is doubled + until this maximum period is reached. + The default value of zero means no exponential backoff is performed. + + + + + The upper limit to the size for inbound messages. + -1 (the default value) means no limit. + + + If a peer sends a message larger than this it is disconnected. + + + + + The high-water mark for message transmission, which is the number of messages that are allowed to queue up + before mitigative action is taken. The default value is 1000. + + + + + The high-water mark for message reception, which is the number of messages that are allowed to queue up + before mitigative action is taken. The default value is 1000. + + + + + The time-to-live (maximum number of hops) that outbound multicast packets + are allowed to propagate. + The default value of 1 means that the multicast packets don't leave the local network. + + + + + Specifies the amount of time after which a synchronous send call will time out. + A value of 0 means Send will return immediately, with a EAGAIN error if the message cannot be sent. + -1 means to block until the message is sent. + + + + + This indicates the underlying native socket type. + + + An IPv4 socket will only use IPv4, while an IPv6 socket lets applications + connect to and accept connections from both IPv4 and IPv6 hosts. + + + + + The last endpoint bound for TCP and IPC transports. + The returned value will be a string in the form of a ZMQ DSN. + + + If the TCP host is ANY, indicated by a *, then the returned address + will be 0.0.0.0 (for IPv4). + + + + + Sets the RouterSocket behavior when an unroutable message is encountered. + A value of 0 is the default and discards the message silently when it cannot be routed. + A value of 1 returns an EHOSTUNREACH error code if the message cannot be routed. + + + + + Whether to use TCP keep-alive on this socket. + 0 = no, 1 = yes, + -1 (the default value) means to skip any overrides and leave it to the OS default. + + + + + The keep-alive time - the duration between two keepalive transmissions in idle condition. + + + The TCP keepalive period is required by socket implementers to be configurable and by default is + set to no less than 2 hours. + In 0MQ, -1 (the default value) means to just leave it to the OS default. + + + + + The TCP keep-alive interval - the duration between two keepalive transmission if no response was received to a previous keepalive probe. + + + By default a keepalive packet is sent every 2 hours or 7,200,000 milliseconds + if no other data have been carried over the TCP connection. + If there is no response to a keepalive, it is repeated once every KeepAliveInterval seconds. + The default is one second. + + + + + The list of accept-filters, which denote the addresses that a socket may accept. + Setting this to null clears the filter. + + + This applies to IPv4 addresses only. + + + + + This applies only to XPub sockets. + If true, send all subscription messages upstream, not just unique ones. + The default is false. + + + + + If true, router socket accepts non-zmq tcp connections + + + + + This is an XPublisher-socket welcome-message. + + + + + This applies only to XPub sockets. + If true, enable broadcast option on XPublishers + + + + + The low-water mark for message transmission. This is the number of messages that should be processed + before transmission is unblocked (in case it was blocked by reaching high-watermark). The default value is + calculated using relevant high-watermark (HWM): HWM > 2048 ? HWM - 1024 : (HWM + 1) / 2 + + + + + The low-water mark for message reception. This is the number of messages that should be processed + before reception is unblocked (in case it was blocked by reaching high-watermark). The default value is + calculated using relevant high-watermark (HWM): HWM > 2048 ? HWM - 1024 : (HWM + 1) / 2 + + + + + When enabled new router connections with same identity take over old ones + + + + + Returns the last peer routing id connect to the PEER socket + + + + + Defines whether the socket will act as server for CURVE security. + A value of true means the socket will act as CURVE server. + A value of false means the socket will not act as CURVE server, and its security role then depends on other option settings. + Setting this to false shall reset the socket security to NULL. + When you set this you must also set the server's secret key. A server socket does not need to know its own public key. + + + + + Sets the socket's long term public key. You must set this on CURVE client sockets. + You can provide the key as 32 binary bytes, + The public key must always be used with the matching secret key. + To generate a public/secret key pair, NetMQKeyPair.Create. + + + + + Sets the socket's long term secret key. + You must set this on both CURVE client and server sockets. + You can provide the key as 32 binary bytes. + To generate a public/secret key pair, NetMQKeyPair.Create. + + + + + Sets the socket's long term server key. + You must set this on CURVE client sockets. + You can provide the key as 32 binary bytes. + This key must have been generated together with the server's secret key. + To generate a public/secret key pair, use NetMQKeyPair.Create. + + + + + Time in milliseconds between sending heartbeat PING messages. + + + + + If remote peer receives a PING message and doesn't receive another + message within the ttl value, it should close the connection + (measured in tenths of a second) + + + + + Time in milliseconds to wait for a PING response before disconnecting + + + + + Hello Message to send to peer upon connecting + + + + + Specifies the byte-order: big-endian, vs little-endian. + + + + + Specifies the max datagram size for PGM. + + + + + This is the base-class for all objects that participate in inter-thread communication. + + + + + This Ctx is the context that provides access to the global state. + + + + + This is the thread-ID of the thread that this object belongs to. + + + + + Create a new ZObject with the given context and thread-id. + + the context for the new ZObject to live within + the integer thread-id for the new ZObject to be associated with + + + + Create a new ZObject that has the same context and thread-id as the given parent-ZObject. + + another ZObject that provides the context and thread-id for this one + + + + Get the id of the thread that this object belongs to. + + + + + Get the context that provides access to the global state. + + + + The given address was not found in the list of endpoints. + + + + Returns the that is the least busy at the moment. + + Which threads are eligible (0 = all). + The least busy thread, or null if none is available. + + + + Send the Stop command. + + + + + Send the Plug command, incrementing the destinations sequence-number if incSeqnum is true. + + the Own to send the command to + a flag that dictates whether to increment the sequence-number on the destination (optional - defaults to false) + + + + Send the Own command, and increment the sequence-number of the destination + + the Own to send the command to + the object to Own + + + + Send the Attach command + + the Own to send the command to + + + + + + Send the Bind command + + + + + + + + For owned objects, asks the owner () to terminate . + + + + + + + Send a Done command to the Ctx itself (null destination). + + + + + Socket sends a CancellationRequested command to itself when a CancellationToken has been cancelled + + + + + Send the given Command, on that commands Destination thread. + + the Command to send + + + Not supported on the ZObject class. + + + Not supported on the ZObject class. + + + Not supported on the ZObject class. + + + Not supported on the ZObject class. + + + Not supported on the ZObject class. + + + + Process the bind command with the given pipe. + + + Not supported on the ZObject class. + + + Not supported on the ZObject class. + + + Not supported on the ZObject class. + + + + This method would be called to assign the specified pipe as a replacement for the outbound pipe that was being used. + This, is an abstract method that is to be overridden by subclasses to provide their own concrete implementation. + + the pipe to use for writing + + A "Hiccup" occurs when an outbound pipe experiences something like a transient disconnect or for whatever other reason + is no longer available for writing to. + + No supported on the ZObject class. + + + + Process the terminate-pipe command. + + Not supported on the ZObject class. + + + + Process the terminate-pipe acknowledgement command. + + Not supported on the ZObject class. + + + + Process a termination-request command on the Own object. + + + Not supported on the ZObject class. + + + + Process a termination request. + + a time (in milliseconds) for this to linger before actually going away. -1 means infinite. + Not supported on the ZObject class. + + + + Process the termination-acknowledgement command. + + Not supported on the ZObject class. + + + Not supported on the ZObject class. + + + + Special handler called after a command that requires a seqnum + was processed. The implementation should catch up with its counter + of processed commands here. + + Not supported on the ZObject class. + + + + Handler for cancellation requested + + + + + This enum-type specifies either big-endian (Big) or little-endian (Little), + which indicate whether the most-significant bits are placed first or last in memory. + + + + + Most-significant bits are placed first in memory. + + + + + Most-significant bits are placed last in memory. + + + + + This enum-type represents the various numeric socket-related error codes. + + + + + The provided endpoint is not connected. + + + + + The requested address is already in use. + + + + + Non-blocking mode was requested and the message cannot be sent at the moment. + + + + + Permission denied + + + + + The endpoint supplied is invalid. + + + + + The connection is still in progress. + + + + + The requested transport protocol is not supported. + + + + + The provided context is invalid. + + + + + The requested address was not available. + For Bind operations, that can mean the address was not local. + + + + + The network appears to be down. + + + + + There is not enough buffer space for the requested operation. + + + + + The socket is not connected. + + + + + The connection was refused. + + + + + The host is not reachable. + + + + + This is the value chosen for beginning the range of 0MQ error codes. + + + + + The message is too long. + + + + + The address family is not supported by this protocol. + + + + + The network is apparently not reachable. + + + + + The connection-attempt has apparently been aborted. + + + + + The connection has apparently been reset. + + + + + The operation timed-out. + + + + + The connection has apparently been reset. + + + + + The operation cannot be performed on this socket at the moment due + to the socket not being in the appropriate state. + + + + + The context associated with the specified socket has already been terminated. + + + + + No I/O thread is available to accomplish this task. + + + + + Too many sockets for this process. + + + + + Facilitates a pattern whereby an event may be decorated with logic that transforms its arguments. + + + Use of this class requires providing actions that register and unregister a handler of the source + event that calls with updated arguments in response. + + Argument type of the decorated event. + + + + Initialises a new instance. + + an Action to perform when the first handler is registered for the event + an Action to perform when the last handler is unregistered from the event + + + + Raise, or "Fire", the Event. + + the sender that the event-handler that gets notified of this event will receive + the subclass of EventArgs that the event-handler will receive + + + + Send and Receive extensions for sockets with group capability (ServerSocket) + + + + + Transmit a byte-array of data over this socket, block until message is sent. + + the socket to transmit on + The group to send the message to. + the byte-array of data to send + + + + Transmit a byte-array of data over this socket, block until frame is sent. + + the socket to transmit on + The group to send the message to. + the byte-array of data to send + the number of bytes to send from . + + + + Attempt to transmit a byte-array of data on . + If message cannot be sent within , return false. + + the socket to transmit on + The maximum period of time to try to send a message. + The group to send the message to. + the byte-array of data to send + the number of bytes to send from . + true if a message was available, otherwise false. + + + + Attempt to transmit a byte-array of data on . + If message cannot be sent within , return false. + + the socket to transmit on + The maximum period of time to try to send a message. + The group to send the message to. + the byte-array of data to send + true if a message was available, otherwise false. + + + + Attempt to transmit a byte-array of data on . + If message cannot be sent immediately, return false. + + the socket to transmit on + The group to send the message to. + the byte-array of data to send + true if a message was available, otherwise false. + + + + Attempt to transmit a single frame on . + If message cannot be sent immediately, return false. + + the socket to transmit on + The group to send the message to. + the byte-array of data to send + the number of bytes to send from . + true if a message was available, otherwise false. + + + + Transmit a byte-array of data over this socket asynchronously. + + the socket to transmit on + The group to send the message to. + the byte-array of data to send + + + + Transmit a byte-array of data over this socket asynchronously. + + the socket to transmit on + The group to send the message to. + the byte-array of data to send + the number of bytes to send from . + + + + Transmit a string over this socket, block until message is sent. + + the socket to transmit on + The group to send the message to. + the string to send + + + + Attempt to transmit a single string frame on . + If message cannot be sent within , return false. + + the socket to transmit on + The maximum period of time to try to send a message. + The group to send the message to. + the string to send + true if a message was available, otherwise false. + + + + Attempt to transmit a single string frame on . + If message cannot be sent immediately, return false. + + the socket to transmit on + The group to send the message to. + the string to send + true if a message was available, otherwise false. + + + + Transmit a string over this socket asynchronously. + + the socket to transmit on + The group to send the message to. + the string to send + + + + Receive a bytes from , blocking until one arrives. + + The socket to receive from. + The token to monitor for cancellation requests. The default value is . + Tuple of group and received bytes + The token has had cancellation requested. + + + + Attempt to receive a byte-array . + If no message is immediately available, return false. + + The socket to receive from. + The message group + The content of the received message, or null if no message was available. + true if a message was available, otherwise false. + + + + Attempt to receive a byte-array . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + The message group. + The content of the received message, or null if no message was available. + The token to monitor for cancellation requests. The default value is . + true if a message was available, otherwise false. + The method would return false if cancellation has had requested. + + + + Receive a bytes from asynchronously. + + The socket to receive from. + The token to monitor for cancellation requests. The default value is . + Tuple of group and received bytes + The token has had cancellation requested. + + + + Receive a string from , blocking until one arrives, and decode using . + + The socket to receive from. + The token to monitor for cancellation requests. The default value is . + Tuple of group and the content of the received message as a string. + The token has had cancellation requested. + + + + Receive a string from , blocking until one arrives, and decode using . + + The socket to receive from. + The encoding used to convert the data to a string. + The token to monitor for cancellation requests. The default value is . + Tuple of group and the content of the received message as a string. + The token has had cancellation requested. + + + + Attempt to receive a string from , and decode using . + If no message is immediately available, return false. + + The socket to receive from. + The message group. + The content of the received message as a string, or null if no message was available. + true if a message was available, otherwise false. + + + + Attempt to receive a string from , and decode using . + If no message is immediately available, return false. + + The socket to receive from. + The encoding used to convert the data to a string. + The message group. + The content of the received message as a string, or null if no message was available. + true if a message was available, otherwise false. + + + + Attempt to receive a string from , and decode using . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + The message group + The content of the received message as a string, or null if no message was available. + The token to monitor for cancellation requests. The default value is . + true if a message was available, otherwise false. + The method would return false if cancellation has had requested. + + + + Attempt to receive a string from , and decode using . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + The encoding used to convert the data to a string. + The message group + The content of the received message as a string, or null if no message was available. + The token to monitor for cancellation requests. The default value is . + true if a message was available, otherwise false. + The method would return false if cancellation has had requested. + + + + Receive a string from asynchronously. + + The socket to receive from. + The token to monitor for cancellation requests. The default value is . + Tuple of group and a string + The token has had cancellation requested. + + + + Interface to of the NetMQPoller, implement to fake the NetMQPoller in tests. + + + + + Runs the poller on the caller's thread. Only returns when or are called from another thread. + + + + + Runs the poller in a background thread, returning once the poller has started. + + + + + Stops the poller. + + + If called from a thread other than the poller thread, this method will block until the poller has stopped. + If called from the poller thread it is not possible to block. + + + + + Stops the poller, returning immediately and most likely before the poller has actually stopped. + + + + + Get whether this object is currently polling its sockets and timers. + + + + + Add a socket to the poller + + Socket to add to the poller + + + + Remove a socket from the poller + + The socket to be removed + + + + Remove the socket from the poller and dispose the socket + + The socket to be removed + + + + NetMQSocket interface, implement to fake the NetMQSocket in tests. + + + + + This event occurs when at least one message may be received from the socket without blocking. + + + This event is raised when a is added to a running . + + + + + This event occurs when at least one message may be sent via the socket without blocking. + + + This event is raised when a is added to a running . + + + + + Get the of this socket. + + + + + Get whether a message is waiting to be picked up (true if there is, false if there is none). + + The socket has been stopped. + + + + Get whether a message is waiting to be sent. + + + This is true if at least one message is waiting to be sent, false if there is none. + + The socket has been stopped. + + + + Bind the socket to . + + a string representing the address to bind this socket to + thrown if the socket was already disposed + The socket has been stopped. + The specified address is already in use. + No IO thread was found, or the protocol's listener encountered an + error during initialisation. + + + Binds the specified TCP to an available port, assigned by the operating system. + the chosen port-number + thrown if the socket was already disposed + uses a protocol other than TCP. + The socket has been stopped. + The specified address is already in use. + No IO thread was found, or the protocol's listener errored during + initialisation. + + + + Connect the socket to . + + a string denoting the address to connect this socket to + thrown if the socket was already disposed + The socket has been stopped. + No IO thread was found. + The specified address is already in use. + + + + Disconnect this socket from . + + a string denoting the address to disconnect from + thrown if the socket was already disposed + The socket has been stopped. + Endpoint was not found and cannot be disconnected. + + + + Unbind this socket from . + + a string denoting the address to unbind from + thrown if the socket was already disposed + The socket has been stopped. + Endpoint was not found and cannot be disconnected. + + + Closes this socket, rendering it unusable. Equivalent to calling . + + + + Wait until a message is ready to be received from the socket. + + + + + Wait until a message is ready to be received/sent from this socket or until timeout is reached. + If a message is available, the ReceiveReady/SendReady event is fired. + + a TimeSpan that represents the timeout-period + true if a message was available within the timeout, false otherwise + + + + Poll this socket, which means wait for an event to happen within the given timeout period. + + the poll event(s) to listen for + the timeout period + + PollEvents.None -> no message available + PollEvents.PollIn -> at least one message has arrived + PollEvents.PollOut -> at least one message is ready to send + PollEvents.Error -> an error has occurred + or any combination thereof + + The internal select operation failed. + The socket has been stopped. + + + + Listen to the given endpoint for SocketEvent events. + + A string denoting the endpoint to monitor + The specific events to report on. Defaults to if omitted. + is null. + cannot be empty or whitespace. + This object is already disposed. + The protocol of is not supported. + The socket has been stopped. + Maximum number of sockets reached. + + + + class InterfaceItem provides the properties Address and BroadcastAddress (both are an IPAddress). + This serves to convey information for each of the network interfaces present on a host. + + + + + Create a new InterfaceItem from the given address and broadcast-address. + + an IPAddress that will comprise the 'Address' of the new InterfaceItem + an IPAddress that will comprise the 'BroadcastAddress' of the new InterfaceItem + + + + Get the 'address' of this network interface, as an IPAddress. + + + + + Get the 'broadcast-address' of this network interface, as an IPAddress. + + + + + This is a list of InterfaceItems, each of which has an Address and BroadcastAddress, + which is derived from all of the Network Interfaces present on this host at the time an instance of this class is created. + + + + + Create a new InterfaceCollection that contains a list of InterfaceItems derived from all of the Network Interfaces present on this host. + + + + + Return an IEnumerator over the InterfaceItems that this InterfaceCollection contains, + which are all of the network interfaces that were not running, nor loopback nor PPP interfaces. + + an IEnumerator over the InterfaceItems that this contains + + + + Interface IOutgoingSocket mandates a Send( Msg, SendReceiveOptions ) method. + + + + + Send a message if one is available within . + + An object with message's data to send. + The maximum length of time to try and send a message. If , no + wait occurs. + Indicate if another frame is expected after this frame + true if a message was sent, otherwise false. + + + + Defines a socket from which message data may be read. + + + + + Receive a message if one is available within . + + An object to receive the message's data into. + The maximum length of time to wait for a message. If , no + wait occurs. + true if a message was received, otherwise false. + + + + Implementations provide a via the property. + + + + + Gets a instance. + + + + + Gets whether the object has been disposed. + + + + + + + + This interface provides an abstraction over the legacy Poller and newer classes for use in . + + + + + Add a socket to a poller + + + + + + Remove a socket from poller + + + + + + Remove a socket and dispose it + + + + + + + The type of security mechanism + + + + + No security + + + + + Username and password mechanism over non-encrypted channel + + + + + Curve encryption mechanism + + + + + Monitors a for events, raising them via events. + + + To run a monitor instance, either: + + Call (blocking) and , or + Call and . + + + + + + Create a new monitor object + + Socket to monitor + Bind endpoint + Flag enum of the events to monitored + + + + Initialises a monitor on for a specified . + + + This constructor matches the signature used by clrzmq. + + The socket to monitor. + a string denoting the endpoint which will be the monitoring address + + A flag indicating whether ownership of is transferred to the monitor. + If true, disposing the monitor will also dispose . + + + + + The monitoring address. + + + + + Get whether this monitor is currently running. + + + Start the monitor running via either or . + Stop the monitor via either or . + + + + + Gets and sets the timeout interval for poll iterations when using and . + + + The higher the number the longer it may take the to stop the monitor. + This value has no effect when the monitor is run via . + + + + + Raised whenever any monitored event fires. + + + + + Occurs when a connection is made to a socket. + + + + + Occurs when a synchronous connection attempt failed, and its completion is being polled for. + + + + + Occurs when an asynchronous connect / reconnection attempt is being handled by a reconnect timer. + + + + + Occurs when a socket is bound to an address and is ready to accept connections. + + + + + Occurs when a socket could not bind to an address. + + + + + Occurs when a connection from a remote peer has been established with a socket's listen address. + + + + + Occurs when a connection attempt to a socket's bound address fails. + + + + + Occurs when a connection was closed. + + + + + Occurs when a connection couldn't be closed. + + + + + Occurs when the stream engine (TCP and IPC specific) detects a corrupted / broken session. + + + + + Add the monitor object to a NetMQPoller, register to to be signalled on new events + + + + + + + + + Remove the monitor object from attached poller + + + + + Start monitor the socket, the method doesn't start a new thread and will block until the monitor poll is stopped + + The Monitor must not have already started nor attached to a poller. + + + + Start a background task for the monitoring operation. + + + + + + Stop monitoring. Blocks until monitoring completed. + + If this monitor is attached to a poller you must detach it first and not use the stop method. + + + + Release and dispose of any contained resources. + + + + + Release and dispose of any contained resources. + + true if releasing managed resources + + + + Base class for all event arguments raised by . + + + + + Create a new NetMQMonitorEventArgs that contains the given monitor and address. + + The that raised this event. + The address of the event. + The type of socket event that occurred. + + + + Gets the that raised this event. + + + + + Gets the address of the event. + + + + + Gets the type of socket event that occurred. + + + + + A subclass of that also holds a socket. + + + + + Create a new NetMQMonitorSocketEventArgs that contains the given monitor, address, and socket. + + The that raised this event. + The address of the event. + The type of socket event that occurred. + The socket upon which this event occurred. + + + + Gets the socket upon which this event occurred. + + + + + A subclass of that also holds an error code. + + + + + Create a new NetMQMonitorErrorEventArgs that contains the given monitor, address, and error-code. + + The that raised this event. + The address of the event. + The type of socket event that occurred. + The error code associated with this event. + + + + Gets the error code associated with this event. + + + + + A subclass of that also holds an interval. + + + + + Create a new NetMQMonitorIntervalEventArgs containing the given NetMQMonitor, address, and interval. + + the NetMQMonitor + The a string denoting the address + The interval, in milliseconds. + The type of socket event that occurred. + + + + Gets the interval, in milliseconds. + + + + Defines a set of flags applicable to a instance: None (default), More, Identity, Shared + + + Indicates no flags are set (the default). + + + Indicates that more frames of the same message follow. + + + + Command frame (see ZMTP spec) + Command types, use only bits 2-5 and compare with ==, not bitwise, + a command can never be of more that one type at the same time + + + + Indicates that this frame conveys the identity of a connected peer. + + + Indicates that this frame's internal data is shared with other objects. + + + Enumeration of possible types: Uninitialised, GC, Pool, Delimiter. + + + The has not yet been initialised (default value). + + + The is empty. + + + The data will be garbage collected when no longer needed. + + + + Join message for radio-dish + + + + + Leave message for radio_dish + + + + + The data was allocated by , and must be released back + to this pool when no longer needed. This happens when is called. + + + + The is a delimiter frame and doesn't contain any data. + Delimiters are commonly used to mark a boundary between groups frames. + + + + A Msg struct is the lowest-level interpretation of a ZeroMQ message, and simply contains byte-array data + and MsgType and MsgFlags properties. + It supports message buffer pooling. + + + Many users will not use this class directly. However in high-performance situations it + may be useful. When used correctly it's possible to have zero-copy and zero-allocation + behaviour. + + + + + The maximum length of a group (Radio/Dish) + + + + An atomic reference count for knowing when to release a pooled data buffer back to the . + Will be null unless equals . + + + + Get the number of bytes within the Data property. + + + + + Returns true if msg is empty + + + + + Returns true if the msg is join message + + + + + Returns true if the msg is leave message + + + + + Gets the position of the first element in the Data property delimited by the message, + relative to the start of the original array. + Deprecated: use or implicit casting to Span + + + + Get the type of this message, from the MsgType enum. + + + + Get whether the Delimiter bit is set on the Flags property, + which would indicate that this message is intended for use simply to mark a boundary + between other parts of some unit of communication. + + + + Get whether this is initialised and ready for use. + A newly constructed is uninitialised, and can be initialised via one + of , , , , or . + Calling will cause the to become uninitialised again. + true if the is initialised, otherwise false. + + + + Get the flags-enum MsgFlags value, which indicates which of the More, Identity, or Shared bits are set. + + + + + Get the "Has-More" flag, which when set on a message-queue frame indicates that there are more frames to follow. + + + + + Get whether the buffer of this is shared with another instance. + Only applies to pooled message types. + + + + + Get whether the Identity bit is set on the Flags property. + + + + + Set the indicated Flags bits. + + which Flags bits to set (More, Identity, or Shared) + + + + Clear the indicated Flags bits. + + which Flags bits to clear (More, Identity, or Shared) + + + + Routing id of the message, for SERVER and PEER sockets only. + + + + + Reset routing id back to zero + + + + + Set or retrieve the group for RADIO/DISH sockets + + Value is larger than 255. + + + + Get the byte-array that represents the data payload of this . + Deprecated: use or implicit casting to Span + + + This value will be null if is , + or . + + + + + Return the internal buffer as Span + + The span + + + + Return the internal buffer as Memory + + The memory + + + + Returns a slice of the internal buffer. + + The offset to take the span from + + + + Returns a slice of the internal buffer. + + The offset to take the span from + The size of the slice + + + + Copy the content of the message into a Span + + The span to copy content to + + + + Return a copy of the internal buffer as byte array + + Byte array + + + + Implicit case of of Msg to Span + + Span + + + + Implicit case of of Msg to ReadOnlySpan + + Span + + + + Returns span enumerator, to iterate of the Msg + + Span Enumerator + + + + Clear this Msg to empty - ie, set MsgFlags to None, MsgType to Empty, and clear the Data. + + + + + Initialise this Msg to be of MsgType.Pool, with a data-buffer of the given number of bytes. + + the number of bytes to allocate in the data-buffer + + + + Initialise this Msg to be of MsgType.GC with the given data-buffer value. + + the byte-array of data to assign to the Msg's Data property + the number of bytes that are in the data byte-array + + + + Initialise this Msg to be of MsgType.GC with the given data-buffer value. + + the byte-array of data to assign to the Msg's Data property + first byte in the data array + the number of bytes that are in the data byte-array + + + + Set this Msg to be of type MsgType.Delimiter with no bits set within MsgFlags. + + + + + Clear the and set the MsgType to Invalid. + If this is not a shared-data Msg (MsgFlags.Shared is not set), or it is shared but the reference-counter has dropped to zero, + then return the data back to the BufferPool. + + The object is not initialised. + + + + If this Msg is of MsgType.Pool, then - add the given amount number to the reference-counter + and set the shared-data Flags bit. + If this is not a Pool Msg, this does nothing. + + the number to add to the internal reference-counter + + + + If this Msg is of MsgType.Pool and is marked as Shared, then - subtract the given amount number from the reference-counter + and, if that reaches zero - return the data to the shared-data pool. + If this is not both a Pool Msg and also marked as Shared, this simply Closes this Msg. + + the number to subtract from the internal reference-counter + + + + Override the Object ToString method to show the object-type, and values of the MsgType, Size, and Flags properties. + + a string that provides some detail about this Msg's state + + + + Convert the Msg to string + + The encoding to use for the conversion + The string + + + + Convert the Msg to string + + The encoding to use for the conversion + Offset to start conversion from + Number of bytes to convert + The string + + + + Copy the given byte-array data to this Msg's Data buffer. + + the source byte-array to copy from + index within the internal Data array to copy that byte to + the number of bytes to copy + + + + Copy the given byte-array data to this Msg's Data buffer. + + the source byte-array to copy from + first byte in the source byte-array + index within the internal Data array to copy that byte to + the number of bytes to copy + + + + Copy the given single byte to this Msg's Data buffer. + + the source byte to copy from + + + + Copy the given single byte to this Msg's Data buffer at the given array-index. + + the source byte to copy from + index within the internal Data array to copy that byte to + + + + Write a string into msg at the specified index + + The encoding to use for the writing + The string to write + The index to write the string to + + + + Copy the given byte-array data to this Msg's Data buffer. + + the source byte-array to copy from + index within the internal Data array to copy that byte to + + + + Get and set the byte value in the buffer at a specific index. + + The index to access + + + + + Close this Msg, and effectively make this Msg a copy of the given source Msg + by simply setting it to point to the given source Msg. + If this is a Pool Msg, then this also increases the reference-counter and sets the Shared bit. + + the source Msg to copy from + The object is not initialised. + + + + Increase Offset and decrease Size by the given count. + + Number of bytes to remove from a message + + + + Close this Msg and make it reference the given source Msg, and then clear the Msg to empty. + + the source-Msg to become + The object is not initialised. + + + + Returns a new array containing the first bytes of . + Deprecated: use + + + + + An IShimHandler provides a Run(PairSocket) method. + + + + + Execute whatever action this IShimHandler represents against the given shim. + + + + + + This is an EventArgs that provides an Actor property. + + + + + Create a new NetMQActorEventArgs with the given NetMQActor. + + the NetMQActor for this exception to reference + + + + Get the NetMQActor that this exception references. + + + + + This delegate represents the action for this actor to execute. + + the that is the shim to execute this action + + + + This delegate represents the action for this actor to execute - along with a state-information object. + + the type to use for the state-information object + the that is the shim to execute this action + the state-information that the action will use + + + + The Actor represents one end of a two-way pipe between 2 PairSocket(s). Where + the actor may be passed messages, that are sent to the other end of the pipe + which is called the "shim" + + + + + The terminate-shim command. + This is just the literal string "endPipe". + + + + + Create a new ActionShimHandler with the given type T to serve as the state-information, + and the given action to operate upon that type. + + a ShimAction of type T that comprises the action to perform + the state-information + + + + Perform the action upon the given shim, using our state-information. + + a that is the shim to perform the action upon + + + + Create a new ActionShimHandler with a given action to operate upon that type. + + a ShimAction that comprises the action to perform + + + + Perform the action upon the given shim, using our state-information. + + a that is the shim to perform the action upon + + + + Create a new with the given shimHandler. + + an IShimHandler that provides the Run method + the newly-created NetMQActor + + + + Create a new with the action, and state-information. + + a ShimAction - delegate for the action to perform + the state-information - of the generic type T + the newly-created NetMQActor + + + + Create a new with the given . + + a ShimAction - delegate for the action to perform + the newly-created NetMQActor + + + + Execute the shim handler's Run method, signal ok and then dispose of the shim. + + + + + Transmit the given Msg over this actor's own socket. + + the Msg to transmit + The maximum length of time to try and send a message. If , no + wait occurs. + Indicate if another frame is expected after this frame + true if a message was sent, otherwise false. + The socket has been stopped. + is not initialised. + + + + Attempt to receive a message for the specified period of time, returning true if successful or false if it times-out. + + a Msg to write the received message into + a TimeSpan specifying how long to block, waiting for a message, before timing out + true only if a message was indeed received + + + + This event occurs when at least one message may be received from the socket without blocking. + + + + + This event occurs when a message is ready to be transmitted from the socket. + + + + + + + + Release any contained resources. + + true if managed resources are to be released + + + + + + + A NetMQBeaconEventArgs is an EventArgs that provides a property that holds a NetMQBeacon. + + + + + Create a new NetMQBeaconEventArgs object containing the given NetMQBeacon. + + the NetMQBeacon object to hold a reference to + + + + Get the NetMQBeacon object that this holds. + + + + + NetMQBeacon implements a peer-to-peer discovery service for local networks. + + + A beacon can broadcast and/or capture service announcements using UDP messages on the local area network. + You can define the format of your outgoing beacons, and set a filter that validates incoming beacons. + Beacons are sent and received asynchronously in the background. + + We can use the NetMQBeacon to discover and connect to other NetMQ/CZMQ services in the network automatically + without central configuration. Please note that to use NetMQBeacon your infrastructure must support broadcast. + Most cloud providers don't support broadcast. + + + + + Create a new NetMQBeacon. + + + + + Get the host name this beacon is bound to. + + + This may involve a reverse DNS lookup which can take a second or two. + + An empty string is returned if: + + the beacon is not bound, + the beacon is bound to all interfaces, + an error occurred during reverse DNS lookup. + + + + + + Get the IP address this beacon is bound to. + + + + + Get the socket of the contained actor. + + + + + This event occurs when at least one message may be received from the socket without blocking. + + + + + Configure beacon for the specified port on all interfaces. + + Blocks until the bind operation completes. + The UDP port to bind to. + + + + Configure beacon for the specified port and, optionally, to a specific interface. + + Blocks until the bind operation completes. + The UDP port to bind to. + IP address of the interface to bind to. Pass empty string (the default value) to use the default interface. + + + + Publish beacon immediately and continue to publish when interval elapsed + + Beacon to transmit. + Interval to transmit beacon + Encoding for . Defaults to . + + + + Publish beacon immediately and continue to publish when interval elapsed + + Beacon to transmit + Interval to transmit beacon + + + + Publish beacon immediately and continue to publish every second + + Beacon to transmit + Encoding for . Defaults to . + + + + Publish beacon immediately and continue to publish every second + + Beacon to transmit + + + + Stop publishing beacons. + + + + + Subscribe to beacon messages that match the specified filter. + + + Beacons must prefix-match with . + Any previous subscription is replaced by this one. + + Beacon will be filtered by this + + + + Unsubscribe to beacon messages + + + + + Receives the next beacon message, blocking until it arrives. + + + + + Receives the next beacon message if one is available before expires. + + The maximum amount of time to wait for the next beacon message. + The received beacon message. + true if a beacon message was received, otherwise false. + + + + + + + + + + Contents of a message received from a beacon. + + + + + THe beacon content as a byte array. + + + + + The address of the peer that sent this message. Includes host name and port number. + + + + + The beacon content as a string. + + Decoded using . Other encodings may be used with directly. + + + + The host name of the peer that sent this message. + + This is simply the value of without the port number. + + + + Certificate to be used for the Curve encryption + + + + + Encodes Z85 string + + Data + + + + Decodes Z85 string + + key in Z85 format + If key in invalid + + + + Create a Certificate with a random secret key and a derived public key for the curve encryption + + + + + Create a certificate from secret key and public key + + Secret key + Public key + If secretKey or publicKey are not 32-bytes long + + + + Create a certificate from secret key and public key + + Secret key + Public key + If secretKey or publicKey are not 40-chars long + + + + Create a certificate from secret key, public key is derived from the secret key + + Secret Key + If secret key is not 32-bytes long + The newly created certificate + + + + Create a certificate from secret key, public key is derived from the secret key + + Secret Key + If secret key is not 32-bytes long + The newly created certificate + + + + Create a certificate from secret key, public key is derived from the secret key + + Secret Key + If secret key is not 40-chars long + The newly created certificate + + + + Create a certificate from secret key, public key is derived from the secret key + + Secret Key + If secret key is not 40-chars long + The newly created certificate + + + + Create a public key only certificate. + + Public key + If public key is not 32-bytes long + The newly created certificate + + + + Create a public key only certificate. + + Public key + If public key is not 40-chars long + The newly created certificate + + + + Curve Secret key + + + + + Curve Secret key, encoded. + + + + + Returns true if the certificate also includes a secret key + + + + + Curve Public key. + + + + + Curve Public key, encoded. + + + + + Global configuration class for NetMQ + + + + + Cleanup library resources, call this method when your process is shutting-down. + + Set to true when you want to make sure sockets send all pending messages + + + + Get or set the default linger period for the all sockets, + which determines how long pending messages which have yet to be sent to a peer + shall linger in memory after a socket is closed. + + + This also affects the termination of the socket's context. + + -1: Specifies infinite linger period. Pending messages shall not be discarded after the socket is closed; + attempting to terminate the socket's context shall block until all pending messages have been sent to a peer. + + 0: The default value of specifies no linger period. Pending messages shall be discarded immediately when the socket is closed. + Positive values specify an upper bound for the linger period. Pending messages shall not be discarded after the socket is closed; + attempting to terminate the socket's context shall block until either all pending messages have been sent to a peer, + or the linger period expires, after which any pending messages shall be discarded. + + + + + Get or set the number of IO Threads NetMQ will create, default is 1. + 1 is good for most cases. + + + + + Get or set the maximum number of sockets. + + + + + Method is obsolete, call Cleanup instead + + + + + Method is obsolete, call Cleanup instead + + + + + Method is obsolete, call Cleanup instead + + Should the context block the thread while terminating. + + + + Method is obsolete, context created automatically + + + + + Base class for custom exceptions within the NetMQ library. + + + + + Exception error code + + + + + Create NetMQ Exception + + + + + Create a new NetMQ exception + + + + + + Create a new NetMQ exception + + + + + + Constructor for serialisation. + + + + + + + Create a new NetMQException containing the given Exception, Message and ErrorCode. + + an Exception that this exception will expose via it's InnerException property + the textual description of what gave rise to this exception, to expose via the Message property + an ErrorCode that this exception will expose via its ErrorCode property + + + + Create and return a new NetMQException with no Message containing only the given SocketException. + + a SocketException that this exception will expose via its InnerException property + a new NetMQException + + + + Create and return a new NetMQException with no Message containing the given SocketError and Exception. + + a SocketError that this exception will carry and expose via its ErrorCode property + an Exception that this exception will expose via its InnerException property + a new NetMQException + + + + Create and return a new NetMQException with no Message containing the given ErrorCode and Exception. + + an ErrorCode for this exception to contain and expose via its ErrorCode property + an Exception for this exception to contain and expose via its InnerException property + a new NetMQException + + + + Create and return a new NetMQException with no Message containing only the given ErrorCode. + + an ErrorCode that this exception will carry and expose via its ErrorCode property + a new NetMQException + + + + Create and return a new NetMQException with the given Message and ErrorCode. + + the textual description of what gave rise to this exception, to expose via the Message property + an ErrorCode that this exception will carry and expose via its ErrorCode property + a new NetMQException + + + + Create and return a new NetMQException with the given ErrorCode, Message, and Exception. + + an ErrorCode that this exception will contain and expose via its ErrorCode property + the textual description of what gave rise to this exception, to expose via the Message property + an Exception that this exception will expose via its InnerException property + a new NetMQException, or subclass of NetMQException that corresponds to the given ErrorCode + + + + AddressAlreadyInUseException is a NetMQException that is used within SocketBase.Bind to signal an address-conflict. + + + + + Create a new AddressAlreadyInUseException with a given inner-exception and message. + + an Exception for this new exception to contain and expose via its InnerException property + the textual description of what gave rise to this exception, to expose via the Message property + + + + Create a new AddressAlreadyInUseException with a given message. + + the textual description of what gave rise to this exception, to expose via the Message property + + + Constructor for serialisation. + + + + EndpointNotFoundException is a NetMQException that is used within Ctx.FindEndpoint to signal a failure to find a specified address. + + + + + Create a new EndpointNotFoundException with a given inner-exception and message. + + an Exception for this new exception to contain and expose via its InnerException property + the textual description of what gave rise to this exception, to expose via the Message property + + + + Create a new EndpointNotFoundException with a given message. + + the textual description of what gave rise to this exception, to expose via the Message property + + + + Create a new EndpointNotFoundException with no message nor inner-exception. + + + + Constructor for serialisation. + + + + TerminatingException is a NetMQException that is used within SocketBase and Ctx to signal + that you're making the mistake of trying to do further work after terminating the message-queueing system. + + + + + Create a new TerminatingException with a given inner-exception and message. + + an Exception for this new exception to contain and expose via its InnerException property + the textual description of what gave rise to this exception, to expose via the Message property + + + + Create new TerminatingException + + + + + + Create a new TerminatingException with no message nor inner-exception. + + + + Constructor for serialisation. + + + + InvalidException is a NetMQException that is used within the message-queueing system to signal invalid value errors. + + + + + Create a new InvalidException with a given inner-exception and message. + + an Exception for this new exception to contain and expose via its InnerException property + the textual description of what gave rise to this exception, to expose via the Message property + + + + Create a new InvalidException with the given message. + + the textual description of what gave rise to this exception, to expose via the Message property + + + + Create a new InvalidException with no message nor inner-exception. + + + + Constructor for serialisation. + + + + FaultException is a NetMQException that is used within the message-queueing system to signal general fault conditions. + + + + + Create a new FaultException with a given inner-exception and message. + + an Exception for this new exception to contain and expose via its InnerException property + the textual description of what gave rise to this exception, to expose via the Message property + + + + Create a new FaultException with the given message. + + the textual description of what gave rise to this exception, to expose via the Message property + + + + Create a new FaultException with no message nor inner-exception. + + + + Constructor for serialisation. + + + + ProtocolNotSupportedException is a NetMQException that is used within the message-queueing system to signal + mistakes in properly utilizing the communications protocols. + + + + + Create a new ProtocolNotSupportedException with a given inner-exception and message. + + an Exception for this new exception to contain and expose via its InnerException property + the textual description of what gave rise to this exception, to expose via the Message property + + + + Create a new ProtocolNotSupportedException with the given message. + + the textual description of what gave rise to this exception, to expose via the Message property + + + + Create a new ProtocolNotSupportedException with no message nor inner-exception. + + + + Constructor for serialisation. + + + + HostUnreachableException is an Exception that is used within the message-queueing system + to signal failures to communicate with a host. + + + + + Create a new HostUnreachableException with a given inner-exception and message. + + an Exception for this new exception to contain and expose via its InnerException property + the textual description of what gave rise to this exception, to expose via the Message property + + + + Create a new HostUnreachableException with the given message. + + the textual description of what gave rise to this exception, to expose via the Message property + + + + Create a new HostUnreachableException with no message nor inner-exception. + + + + Constructor for serialisation. + + + + FiniteStateMachineException is an Exception that is used within the message-queueing system + to signal errors in the send/receive order with request/response sockets. + + + + + Create a new FiniteStateMachineException with a given inner-exception and message. + + an Exception for this new exception to contain and expose via its InnerException property + the textual description of what gave rise to this exception, to expose via the Message property + + + + Create a new FiniteStateMachineException with the given message. + + the textual description of what gave rise to this exception, to expose via the Message property + + + + Create a new FiniteStateMachineException with no message nor inner-exception. + + + + Constructor for serialisation. + + + + Objects of class NetMQFrame serve to hold a Buffer (that consists of a byte-array containing a unit of a message-queue message) + and provide methods to construct it given a string and an encoding. + + + + + This is the length of the byte-array data buffer. + + + + + This holds the computed hash-code for this object. + + + + + Create a new NetMQFrame containing the given byte-array data. + + a byte-array to hold as the frame's data + + + + Instantiates a frame from the provided byte array, considering only the specified number of bytes. + + This constructor may be useful to avoid copying data into a smaller array when a buffer is oversized. + The content of the frame. + The number bytes from to consider as part of the frame. + + + + Create a new NetMQFrame containing the given string-message, + using the default ASCII encoding. + + a string containing the message-data of the frame + + + + Create a new NetMQFrame containing the given string-message, + using the given encoding to convert it into a byte-array. + + a string containing the message-data of the frame + the Encoding to use to convert the given string-message into the internal byte-array + + + + Create a new NetMQFrame with a data-buffer pre-sized to the given length. + + the number of bytes to allocate for the data-buffer + length must be non-negative (zero or positive). + + + + Get or set the size of the message data contained in the frame, which here represents the number of bytes. + + The value must be between zero and BufferSize. + + + + Get the underlying frame-data buffer, which is an array of bytes. + + + + + Get the maximum size of the frame-data buffer (ie, the number of bytes of the array). + + + + + Get a new empty that may be used as message separators. + + + + + Get whether this NetMQFrame is empty - that is, has a Buffer of zero-length. + + + + + Create and return a new NetMQFrame with a copy of the supplied byte-array buffer. + + the byte-array to copy into the new NetMQFrame + a new containing a copy of the supplied byte-array + is null. + + + + Return this frame's data-buffer converted into a string, using the default ASCII encoding. + + the data buffer converted to a string + + + + Return this frame's data-buffer converted into a string using the given encoding. + + the Encoding to use to convert the internal byte-array buffer into a string + the data buffer converted to a string + + + + Convert the buffer to integer in network byte order (big-endian) + + + + + + Convert the buffer to long in network byte order (big-endian) + + + + + + Create a deep-copy of the supplied . + + the to copy + a containing a copy of + is null. + + + + Create a deep-copy of this NetMQFrame and return it. + + a new NetMQFrame containing a copy of this one's buffer data + + + + Return true if the buffer of this NetMQFrame is equal to the given byte-array. + + a byte-array buffer to compare this frame against + + + + + Determine whether the specified is equal to the current . + + the to compare with the current . + true if the specified NetMQFrame is equal to this one; otherwise, false + + + + Return true if the given Object is a NetMQFrame which has a Buffer that is identical to that of this one. + + the Object to compare this to + true only if the given Object is a NetMQFrame equal to this one + + + + Return true if this one and the other NetMQFrame are equal, or both are null. + + one frame to compare against the other + the other frame to compare + true if both frames are equal + + + + Return true if this one and the other NetMQFrame NOT are equal. + + one frame to compare against the other + the other frame to compare + false if both frames are equal + + + + Override the Object.GetHashCode method to return a hash-code derived from the content of the Buffer. + That is only computed the first time this method is called. + + an integer that represents the computed hash-code + + + + Return an array of bytes that carries the content of this NetMQFrames Buffer. + + if this argument is true - a new copy is made if BufferSize is not equal to MessageSize + the Buffer as a byte-array, either newly-allocated or else (if copy is false) simply a reference to the actual Buffer + + + + Return an readonly span of bytes that carries the content of this NetMQFrames Buffer. + + the Buffer as a readonly span + + + + This namespace encompasses the NetMQ message-queueing library + and attendant utility software. + + + + + A NetMQMessage is basically a collection of NetMQFrames, and is the basic message-unit that is sent and received + across this message-queueing subsystem. + + + + + This is the frame-stack that comprises the message-content of this message. + + + + + The default-constructor for NetMQMessage: create a new instance of NetMQMessage + with an empty frame-stack. + + + + + Create a new instance of a NetMQMessage that contains the given collection of NetMQFrames as its frame-stack. + + a collection of NetMQFrames, to form the frame-stack + The value of 'frames' cannot be null. + + + + Create a new instance of a NetMQMessage that contains the given collection of byte-arrays as its frame-stack. + + a collection of byte-array buffers, to form the frame-stack + The value of 'buffers' cannot be null. + + + + Gets the first frame in the current message. + + + + + Gets the last frame in the current message. + + + + + Gets a value indicating whether the current message is empty. + + + + + Gets the number of objects contained by this message. + + + + + Gets the at the specified index. + + The zero-based index of the to get. + The at the specified index. + + is less than 0 -or- is equal to or greater than . + + + + + Add the given NetMQFrame to this NetMQMessage, at the highest-indexed position of the frame-stack. + + a NetMQFrame object comprising the frame to be appended onto the frame-stack + + + + Add the given data (in this case a byte-array) to this NetMQMessage, at the highest-indexed position of the frame-stack. + Data is not copied. + + a byte-array containing the message to append onto the frame-stack of this NetMQMessage + + + + Add the given string - which gets converted into a NetMQFrame - onto + the highest-indexed position of the frame-stack of this NetMQMessage. + + a string containing the message to append onto the frame-stack of this NetMQMessage + + + + Add the given string - which gets converted into a NetMQFrame - onto + the highest-indexed position of the frame-stack of this NetMQMessage. + + a string containing the message to append onto the frame-stack of this NetMQMessage + an Encoding that specifies how to convert the string into bytes + + + + Convert the given integer value into an array of bytes and add it as a new frame onto this NetMQMessage. + + a 32-bit integer value that is to be converted into bytes and added to this message + + + + Convert the given long value into an array of bytes and add it as a new frame onto this NetMQMessage. + + a 64-bit number that is to be converted into bytes and added to this message + + + + Add an empty frame to this NetMQMessage. + + + + + Push the given NetMQFrame into the frame-stack of this NetMQMessage. + + the NetMQFrame to be inserted into the frame-stack + + The concept is the same as pushing an element onto a stack. + This inserts the given NetMQFrame into the lowest-indexed position of this NetMQMessage, + pushing all of the other frames upward in index-position. + + + + + Push a new frame containing the given byte-array into the frame-stack of this NetMQMessage. + + the byte-array to create a new frame from + + The concept is the same as pushing an element onto a stack. + This creates a new frame from the given data (in this case a byte-array) and inserts it into the lowest-indexed position of + the collection of frames of this NetMQMessage, + pushing all of the other frames upward in index-position. + + + + + Push a new frame containing the given string (converted into a byte-array) into the frame-stack of this NetMQMessage. + + the string to create a new frame from + + The concept is the same as pushing an element onto a stack. + This creates a new frame from the given data (in this case a string which gets converted into a byte-array using the default ASCII encoding) and inserts it into the lowest-indexed position of + the collection of frames of this NetMQMessage, + pushing all of the other frames upward in index-position. + + + + + Push a new frame containing the given string (converted into a byte-array) into the frame-stack of this NetMQMessage. + + the string to create a new frame from + the Encoding that dictates how to encode the string into bytes + + The concept is the same as pushing an element onto a stack. + This creates a new frame from the given data (in this case a string which gets converted into a byte-array using the given Encoding) and inserts it into the lowest-indexed position of + the collection of frames of this NetMQMessage, + pushing all of the other frames upward in index-position. + + + + + Push a new frame containing the given integer (converted into a byte-array) into the frame-stack of this NetMQMessage. + + the integer to create a new frame from + + The concept is the same as pushing an element onto a stack. + This creates a new frame from the given data (in this case a 32-bit integer which gets converted into a byte-array in big-endian order) and inserts it into the lowest-indexed position of + the collection of frames of this NetMQMessage, + pushing all of the other frames upward in index-position. + + + + + Push a new frame containing the given long (converted into a byte-array) into the frame-stack of this NetMQMessage. + + the 64-bit number to create a new frame from + + The concept is the same as pushing an element onto a stack. + This creates a new frame from the given data (in this case a 64-bit long which gets converted into a byte-array in big-endian order) and inserts it into the lowest-indexed position of + the collection of frames of this NetMQMessage, + pushing all of the other frames upward in index-position. + + + + + Push an empty frame (a NetMQFrame.Empty) onto the frame-stack. + + + + + Remove and return the first frame. + + the first frame, which was popped - which is the frame from the lowest-indexed position + + + + Delete the given frame from the frame-stack. + + the frame to remove + true if removed, otherwise false. + + + + Clear (empty) the frame-stack, so that it no longer contains any frames. + + + + + Return an enumerator over the frames contained within this message. + + an IEnumerator over the frames in this message + + + + Return an enumerator over the frames contained within this message. + + an IEnumerator over the frames in this message + + + + Returns a string showing the frame contents. + + + + + + Enable polling on multiple NetMQSockets + + + + + Get whether the caller is running on the scheduler's thread. + If true, the caller can execute tasks directly (inline). + If false, the caller must start a on this scheduler. + + + This property enables avoiding the creation of a object and + potential delays to its execution due to queueing. In most cases this is just + an optimisation. + + + + if (scheduler.CanExecuteTaskInline) + { + socket.Send(...); + } + else + { + var task = new Task(() => socket.Send(...)); + task.Start(scheduler); + } + + + + + + + + + Returns 1, as runs a single thread and all tasks must execute on that thread. + + + + + Not supported. + + Always thrown. + + + + + + + Run an action on the Poller thread + + The action to run + + + + Create a new NetMQPoller + + + + + Get whether this object is currently polling its sockets and timers. + + + + + Get whether this object is currently disposed + + + + + Add a socket to the poller + + Socket to add to the poller + + + + Add the timer to the Poller, the timer will be invoked on the poller thread when interval elapsed. + + The timer to add to poller + If timer is null + + + + Add a regular .Net Socket to the poller. + The callback will be invoked when the data is ready to be read from the socket + + The socket to poll on + The callback to invoke when the socket is ready + If callback or socket are null + + + + Remove a socket from the poller + + The socket to be removed + If socket is null + If socket is already disposed + If socket is getting disposed during the operation + + + + Remove the socket from the poller and dispose the socket + + The socket to be removed + If socket is null + If socket is disposed + If socket got disposed during the operation + + + + Remove a timer from the poller + + The timer to remove + If poller is null + + + + Remove the .Net socket from the poller + + The socket to remove + If socket is null + + + + Check if poller contains the socket asynchronously. + + + True if the poller contains the socket. + Thrown if socket is null + + + + Check if poller contains the timer asynchronously. + + True if the poller contains the timer. + Thrown if timer is null + + + + Check if poller contains the socket asynchronously. + + + True if the poller contains the socket. + Thrown if socket is null + + + + Runs the poller in a foreground thread, returning once the poller has started. + + + The created thread is named "NetMQPollerThread". Use to specify the thread name. + + + + + Runs the poller in a foreground thread, returning once the poller has started. + + The thread name to use. + + + + Runs the poller in a specified thread - background/foreground, returning once the poller has started. + + The thread name to use. + Allow the poller thread to be a long running + poller (either foreground thread/background) + + + + Runs the poller on the caller's thread. Only returns when or are called from another thread. + + + + + Runs the poller on the caller's thread. Only returns when or are called from another thread. + + The synchronization context that will be used. + + + + Runs the poller on the caller's thread. Only returns when or are called from another thread. + + + + + Stops the poller. + + + If called from a thread other than the poller thread, this method will block until the poller has stopped. + If called from the poller thread it is not possible to block. + + + + + Stops the poller, returning immediately and most likely before the poller has actually stopped. + + + + This class only implements in order to support collection initialiser syntax. + An empty enumerator. + + + + Stops and disposes the poller. The poller may not be used once disposed. + + + Note that you cannot dispose the poller on the poller's thread. Doing so immediately throws an exception. + + A socket in the poller has been disposed. + Dispose called from the poller thread. + + + + Class to quickly handle incoming messages of socket. + New thread is created to handle the messages. Call dispose to stop the thread. + Provided socket will not be disposed by the class. + + + + + Create NetMQProactor and start dedicate thread to handle incoming messages. + + Socket to handle messages from + Handler to handle incoming messages + + + + Stop the proactor. Provided socket will not be disposed. + + + + + Events args for NetMQQueue + + The type of the queue + + + + The queue that invoked the event + + + + + Multi producer single consumer queue which you can poll on with a Poller. + + Type of the item in queue + + + + Create new NetMQQueue. + + The capacity of the queue, use zero for unlimited + + + + Register for this event for notification when there are items in the queue. Queue must be added to a poller for this to work. + + + + + Returns true if the queue is disposed + + + + + Gets the number of items contained in the queue. + + + + + Gets a value that indicates whether the queue is empty. + + + + + Try to dequeue an item from the queue. Dequeueing and item is not thread safe. + + Will be filled with the item upon success + Timeout to try and dequeue and item + Will return false if it didn't succeed to dequeue an item after the timeout. + + + + Dequeue an item from the queue, will block if queue is empty. Dequeueing and item is not thread safe. + + Dequeued item + + + + Enqueue an item to the queue, will block if the queue is full. + + + + + + + + + Dispose the queue. + + + + + NetMQRuntime enable using Meryel.UnityCodeAssist.NetMQSocket receive async methods. + You need to create an instance before calling any async methods. + To continue and process the Tasks call and + + + + + Create a new NetMQRuntime, you can start calling async method after creating a runtime. + + + + + The current thread NetMQRuntime + + + + + Run the tasks to completion + + The list of tasks to run + + + + Run the tasks to completion + + Cancellation token to cancel the run operation before all tasks run to completion + The list of tasks to run + + + + Dispose the runtime, don't call Async method after disposing + + + + + For selecting on and regular .NET objects. + + + This is for advanced scenarios only. + Most use cases are better served by . + + + + + Selector Item used to hold the NetMQSocket/Socket and PollEvents + + + + + Create a new item for NetMQSocket + + + + + + + Create a new item for regular .net socket + + + + + + + Item File Descriptor, regular .net Socket + + + + + Item NetMQSocket + + + + + Events registered for + + + + + Resulted events + + + + + Select on NetMQSocket or Socket, similar behavior to Socket.Select. + + Items to select on (must not be null) + Number of items in the array to select on + a time-out period, in milliseconds + + The internal select operation failed. + is null. + The socket has been stopped. + + + + Abstract base class for NetMQ's different socket types. + + + Various options are available in this base class, though their affect can vary by socket type. + + + + + Create a new NetMQSocket with the given . + + Type of socket to create + + + + + + Create a new NetMQSocket with the given . + + a SocketBase object to assign to the new socket + + + + This event occurs when at least one message may be received from the socket without blocking. + + + This event is raised when a is added to a running . + + + + + This event occurs when at least one message may be sent via the socket without blocking. + + + This event is raised when a is added to a running . + + + + + Fires when either the or event is set. + + + + + Raise the event. + + + + + Get or set an integer that represents the number of errors that have accumulated. + + + + + Get the of this socket. + + + + + Get the underlying . + + + + + Bind the socket to . + + a string representing the address to bind this socket to + thrown if the socket was already disposed + The socket has been stopped. + The specified address is already in use. + No IO thread was found, or the protocol's listener encountered an + error during initialisation. + + + Binds the specified TCP to an available port, assigned by the operating system. + the chosen port-number + thrown if the socket was already disposed + uses a protocol other than TCP. + The socket has been stopped. + The specified address is already in use. + No IO thread was found, or the protocol's listener errored during + initialisation. + + + + Connect the socket to . + + a string denoting the address to connect this socket to + thrown if the socket was already disposed + The socket has been stopped. + No IO thread was found. + The specified address is already in use. + + + + Disconnect this socket from . + + a string denoting the address to disconnect from + thrown if the socket was already disposed + The socket has been stopped. + Endpoint was not found and cannot be disconnected. + + + + Unbind this socket from . + + a string denoting the address to unbind from + thrown if the socket was already disposed + The socket has been stopped. + Endpoint was not found and cannot be disconnected. + + + Closes this socket, rendering it unusable. Equivalent to calling . + + + + Wait until a message is ready to be received from the socket. + + + + + Wait until a message is ready to be received/sent from this socket or until timeout is reached. + If a message is available, the ReceiveReady/SendReady event is fired. + + a TimeSpan that represents the timeout-period + true if a message was available within the timeout, false otherwise + + + + Poll this socket, which means wait for an event to happen within the given timeout period. + + the poll event(s) to listen for + the timeout period + + PollEvents.None -> no message available + PollEvents.PollIn -> at least one message has arrived + PollEvents.PollOut -> at least one message is ready to send + PollEvents.Error -> an error has occurred + or any combination thereof + + The internal select operation failed. + The socket has been stopped. + + + + Return a value that indicates which bit-flags have a corresponding listener, + with PollError always set, + and PollOut set based upon m_sendReady + and PollIn set based upon m_receiveReady. + + a PollEvents value that denotes which events have a listener + + + + Unless this socket is closed, + based upon the given PollEvents - raise the m_receiveReady event if PollIn is set, + and m_sendReady if PollOut is set. + + what to use as the source of the events + the given PollEvents that dictates when of the two events to raise + + + Attempt to receive a message for the specified amount of time. + A reference to a instance into which the received message + data should be placed. + The maximum amount of time the call should wait for a message before returning. + true if a message was received before elapsed, + otherwise false. + + + + Send a message if one is available within . + + An object with message's data to send. + The maximum length of time to try and send a message. If , no + wait occurs. + Indicate if another frame is expected after this frame + true if a message was sent, otherwise false. + + + + Listen to the given endpoint for SocketEvent events. + + A string denoting the endpoint to monitor + The specific events to report on. Defaults to if omitted. + is null. + cannot be empty or whitespace. + This object is already disposed. + The protocol of is not supported. + The socket has been stopped. + Maximum number of sockets reached. + + + + Get whether a message is waiting to be picked up (true if there is, false if there is none). + + The socket has been stopped. + + + + Get whether a message is waiting to be sent. + + + This is true if at least one message is waiting to be sent, false if there is none. + + The socket has been stopped. + + + + Get the integer-value of the specified . + + a ZmqSocketOption that specifies what to get + an integer that is the value of that option + The socket has been stopped. + This object is already disposed. + + + + Get the (generically-typed) value of the specified . + + a ZmqSocketOption that specifies what to get + an object of the given type, that is the value of that option + The socket has been stopped. + This object is already disposed. + + + + Get the value of the specified ZmqSocketOption. + + a ZmqSocketOption that specifies what to get + a TimeSpan that is the value of that option + The socket has been stopped. + + + + Get the 64-bit integer-value of the specified . + + a ZmqSocketOption that specifies what to get + a long that is the value of that option + The socket has been stopped. + + + + Assign the given integer value to the specified . + + a ZmqSocketOption that specifies what to set + an integer that is the value to set that option to + The socket has been stopped. + This object is already disposed. + + + + Assign the given TimeSpan to the specified . + + a ZmqSocketOption that specifies what to set + a TimeSpan that is the value to set that option to + The socket has been stopped. + + + + Assign the given Object value to the specified . + + a ZmqSocketOption that specifies what to set + an object that is the value to set that option to + The socket has been stopped. + This object is already disposed. + + + Closes this socket, rendering it unusable. Equivalent to calling . + + + Closes this socket, rendering it unusable. Equivalent to calling . + true if releasing managed resources + + + + + + + This subclass of EventArgs contains a NetMQSocket, + and IsReadyToReceive and IsReadyToSend flags to indicate whether ready to receive or send. + + + + + Create a new NetMQSocketEventArgs referencing the given socket. + + the NetMQSocket that this is in reference to + + + + Initialise the ReceiveReady and SendReady flags from the given PollEvents value. + + a PollEvents value that indicates whether the socket is ready to send or receive without blocking + + + + Get the NetMQSocket that this references. + + + + + Get whether at least one message may be received by the socket without blocking. + + + + + Get whether at least one message may be sent by the socket without blocking. + + + + Dispatches an asynchronous message to a synchronization context. + + + Dispatches a synchronous message to a synchronization context. + + + + Class NetMQTimerEventArgs is an EventArgs that contains a reference to a NetMQTimer. + + + + + Create a new NetMQTimerEventArgs that contains a reference to the given NetMQTimer. + + the NetMQTimer to hold a reference to + + + + Get the NetMQTimer that this has a reference to. + + + + + A NetMQTimer instance provides the state-information for a timer function, + which is periodically checked by a Poller or a NetMQBeacon. + + + + + A pre-constructed NetMQTimerEventArgs to use whenever raising the Elapsed event. + + + + + This is the timer-interval in milliseconds. + + + + + This flag dictates whether this timer is currently enabled. + + + + + This event is used to signal when the timer has expired. + + + + + Create a new NetMQTimer with the timer-interval specified by the given TimeSpan. + + a TimeSpan that denotes the timer-interval + + This sets the When property to an initial value of -1, to indicate it no future-time applies as yet. + + + + + Create a new NetMQTimer with the given timer-interval in milliseconds. + + an integer specifying the timer-interval in milliseconds + + This sets the When property to an initial value of -1, to indicate it no future-time applies as yet. + + + + + Get or set the timer-interval, in milliseconds. + + + When setting this, When is set to the future point in time from now at which the interval will expire (or -1 if not Enabled). + + + + + Get or set whether this NetMQTimer is on. + + + When setting this to true, When is set to the future point in time from now at which the interval will expire. + When setting this to false, When is set to -1. + + + + + Get or set the value of the low-precision timestamp (a value in milliseconds) that signals when the timer is to expire, + or -1 if not applicable at this time. + + + + + Enable the timer and reset the interval + + + + + If there are any subscribers - raise the Elapsed event. + + the sender to include within the event's event-args + + + + This static class serves to convert between byte-arrays, and various integer sizes + - all of which assume the byte-data is in Big-endian, or "Network Byte Order". + + + + + Given a byte-array assumed to be in Big-endian order, and an offset into it + - return a 16-bit integer derived from the 2 bytes starting at that offset. + + the byte-array to get the short from + + + + + Given a byte-array assumed to be in Big-endian order, and an offset into it + - return a 16-bit integer derived from the 2 bytes starting at that offset. + + the byte-array to get the short from + Offset to read from + + + + + Given a byte-array assumed to be in Big-endian order, and an offset into it + - return a 16-bit integer derived from the 2 bytes starting at that offset. + + the byte-array to get the short from + + + + + + Given a 16-bit integer, return it as a byte-array in Big-endian order. + + the short to convert + a 2-byte array containing that short's bits + + + + Given a 16-bit integer, and a byte-array buffer and offset, + - write the 2 bytes of that integer into the buffer starting at that offset, in Big-endian order. + + the short to convert into bytes + the byte-array to write the short's bytes into + + + + Given a 16-bit integer, and a byte-array buffer and offset, + - write the 2 bytes of that integer into the buffer starting at that offset, in Big-endian order. + + the short to convert into bytes + the byte-array to write the short's bytes into + Offset + + + + Given a 16-bit integer, and a byte-array buffer and offset, + - write the 2 bytes of that integer into the buffer starting at that offset, in Big-endian order. + + the short to convert into bytes + the byte-array to write the short's bytes into + Offset + + + + Given a byte-array assumed to be in Big-endian order, and an offset into it + - return a 32-bit integer derived from the 4 bytes starting at that offset. + + the byte-array to get the integer from + offset + + + + + Given a byte-array assumed to be in Big-endian order, and an offset into it + - return a 32-bit integer derived from the 4 bytes starting at that offset. + + the byte-array to get the integer from + + + + + Given a 32-bit integer, return it as a byte-array in Big-endian order. + + the int to convert + a 4-byte array containing that integer's bits + + + + Given a 32-bit integer, and a byte-array buffer and offset, + - write the 4 bytes of that integer into the buffer starting at that offset, in Big-endian order. + + the integer to convert into bytes + the byte-array to write the integer's bytes into + Offset to write to + + + + Given a 32-bit integer, and a byte-array buffer and offset, + - write the 4 bytes of that integer into the buffer starting at that offset, in Big-endian order. + + the integer to convert into bytes + the byte-array to write the integer's bytes into + + + + Given a byte-array assumed to be in Big-endian order, and an offset into it + - return a 64-bit integer derived from the 8 bytes starting at that offset. + + the byte-array to get the Int64 from + + + + + Given a byte-array assumed to be in Big-endian order, and an offset into it + - return a 64-bit integer derived from the 8 bytes starting at that offset. + + the byte-array to get the Int64 from + + + + + Given a 64-bit integer, return it as a byte-array in Big-endian order. + + The long value to convert from. + The network order presentation of as an 8-byte array. + + + + Given a 64-bit integer, and a byte-array buffer and offset, + - write the 8 bytes of that integer into the buffer starting at that offset, in Big-endian order. + + the long value to convert into bytes + the byte-array to write the long value's bytes into + + + + Given a 64-bit integer, and a byte-array buffer and offset, + - write the 8 bytes of that integer into the buffer starting at that offset, in Big-endian order. + + the long value to convert into bytes + the byte-array to write the long value's bytes into + + + + Given a 64-bit integer, and a byte-array buffer and offset, + - write the 8 bytes of that integer into the buffer starting at that offset, in Big-endian order. + + the long value to convert into bytes + the byte-array to write the long value's bytes into + + + + Given a 64-bit integer, and a byte-array buffer and offset, + - write the 8 bytes of that integer into the buffer starting at that offset, in Big-endian order. + + the long value to convert into bytes + the byte-array to write the long value's bytes into + Offset to write to + + + + Given a byte-array assumed to be in Big-endian order, and an offset into it + - return a 64-bit integer derived from the 8 bytes starting at that offset. + + the byte-array to get the Int64 from + Offset to read from + + + + + Given a byte-array assumed to be in Big-endian order, and an offset into it + - return a 64-bit integer derived from the 8 bytes starting at that offset. + + the byte-array to get the Int64 from + Offset to read from + + + + + This static class serves to provide extension methods for IOutgoingSocket. + + + + + Block until the message can be sent. + + + The call blocks until the message can be sent and cannot be interrupted. + Whether the message can be sent depends on the socket type. + + The socket to send the message on. + An object with message's data to send. + Indicate if another frame is expected after this frame + + + + Transmit a byte-array of data over this socket, block until frame is sent. + + the IOutgoingSocket to transmit on + the byte-array of data to send + set this flag to true to signal that you will be immediately sending another frame (optional: default is false) + + + + Transmit a byte-array of data over this socket, block until frame is sent. + + the IOutgoingSocket to transmit on + the byte-array of data to send + the number of bytes to send from . + set this flag to true to signal that you will be immediately sending another frame (optional: default is false) + + + + Transmit a byte-array of data over this socket, block until frame is sent. + Send more frame, another frame must be sent after this frame. Use to chain Send methods. + + the IOutgoingSocket to transmit on + the byte-array of data to send + a reference to this IOutgoingSocket so that method-calls may be chained together + + + + Transmit a byte-array of data over this socket, block until frame is sent. + Send more frame, another frame must be sent after this frame. Use to chain Send methods. + + the IOutgoingSocket to transmit on + the byte-array of data to send + the number of bytes to send from . + a reference to this IOutgoingSocket so that method-calls may be chained together + + + + Attempt to transmit a single frame on . + If message cannot be sent within , return false. + + the IOutgoingSocket to transmit on + The maximum period of time to try to send a message. + the byte-array of data to send + the number of bytes to send from . + set this flag to true to signal that you will be immediately sending another frame (optional: default is false) + true if a message was available, otherwise false. + + + + Attempt to transmit a single frame on . + If message cannot be sent within , return false. + + the IOutgoingSocket to transmit on + The maximum period of time to try to send a message. + the byte-array of data to send + set this flag to true to signal that you will be immediately sending another frame (optional: default is false) + true if a message was available, otherwise false. + + + + Attempt to transmit a single frame on . + If message cannot be sent immediately, return false. + + the IOutgoingSocket to transmit on + the byte-array of data to send + set this flag to true to signal that you will be immediately sending another frame (optional: default is false) + true if a message was available, otherwise false. + + + + Attempt to transmit a single frame on . + If message cannot be sent immediately, return false. + + the IOutgoingSocket to transmit on + the byte-array of data to send + the number of bytes to send from . + set this flag to true to signal that you will be immediately sending another frame (optional: default is false) + true if a message was available, otherwise false. + + + + Send multiple frames on , blocking until all frames are sent. + + the IOutgoingSocket to transmit on + frames to transmit + + + + Send multiple frames on , blocking until all frames are sent. + + the IOutgoingSocket to transmit on + frames to transmit + + + + Attempt to transmit a multiple frames on . + If frames cannot be sent within , return false. + + the IOutgoingSocket to transmit on + The maximum period of time to try to send a message. + frames to transmit + + + + Attempt to transmit a multiple frames on . + If frames cannot be sent within , return false. + + the IOutgoingSocket to transmit on + The maximum period of time to try to send a message. + frames to transmit + + + + Attempt to transmit a multiple frames on . + If frames cannot be sent immediately, return false. + + the IOutgoingSocket to transmit on + frames to transmit + + + + Attempt to transmit a multiple frames on . + If frames cannot be sent immediately, return false. + + the IOutgoingSocket to transmit on + frames to transmit + + + + Transmit a string over this socket, block until frame is sent. + + the IOutgoingSocket to transmit on + the string to send + set this flag to true to signal that you will be immediately sending another frame (optional: default is false) + + + + Transmit a string over this socket, block until frame is sent. + Send more frame, another frame must be sent after this frame. Use to chain Send methods. + + the IOutgoingSocket to transmit on + the string to send + a reference to this IOutgoingSocket so that method-calls may be chained together + + + + Attempt to transmit a single string frame on . + If message cannot be sent within , return false. + + the IOutgoingSocket to transmit on + The maximum period of time to try to send a message. + the string to send + set this flag to true to signal that you will be immediately sending another frame (optional: default is false) + true if a message was available, otherwise false. + + + + Attempt to transmit a single string frame on . + If message cannot be sent immediately, return false. + + the IOutgoingSocket to transmit on + the string to send + set this flag to true to signal that you will be immediately sending another frame (optional: default is false) + true if a message was available, otherwise false. + + + + Send the multiple part message on the , blocking until the entire message is sent. + + the IOutgoingSocket to transmit on + message to transmit + + + + Attempt to transmit a multiple message on . + If message cannot be sent within , return false. + + the IOutgoingSocket to transmit on + The maximum period of time to try to send a message. + message to transmit + + + + Attempt to transmit a multiple message on . + If frames cannot be sent immediately, return false. + + the IOutgoingSocket to transmit on + message to transmit + + + + Transmit an empty frame over this socket, block until frame is sent. + + the IOutgoingSocket to transmit on + set this flag to true to signal that you will be immediately sending another frame (optional: default is false) + + + + Transmit an empty frame over this socket, block until frame is sent. + Send more frame, another frame must be sent after this frame. Use to chain Send methods. + + the IOutgoingSocket to transmit on + a reference to this IOutgoingSocket so that method-calls may be chained together + + + + Attempt to transmit an empty frame on . + If message cannot be sent within , return false. + + the IOutgoingSocket to transmit on + The maximum period of time to try to send a message. + set this flag to true to signal that you will be immediately sending another frame (optional: default is false) + true if a message was available, otherwise false. + + + + Attempt to transmit an empty frame on . + If message cannot be sent immediately, return false. + + the IOutgoingSocket to transmit on + set this flag to true to signal that you will be immediately sending another frame (optional: default is false) + true if a message was available, otherwise false. + + + + Transmit a status-signal over this socket. + + the IOutgoingSocket to transmit on + a byte that contains the status signal to send + + + + Attempt to transmit a status-signal over this socket. + If signal cannot be sent immediately, return false. + + the IOutgoingSocket to transmit on + a byte that contains the status signal to send + + + + Transmit a specific status-signal over this socket that indicates OK. + + the IOutgoingSocket to transmit on + + + + Attempt to transmit a specific status-signal over this socket that indicates OK. + If signal cannot be sent immediately, return false. + + the IOutgoingSocket to transmit on + + + + Transmit a specific status-signal over this socket that indicates there is an error. + + the IOutgoingSocket to transmit on + + + + Attempt to transmit a specific status-signal over this socket that indicates there is an error. + If signal cannot be sent immediately, return false. + + the IOutgoingSocket to transmit on + + + + Send routing key over . + + the IOutgoingSocket to transmit on + the routing key to send + + + + Attempt to transmit routing key over . + If message cannot be sent immediately, return false. + Routing is always sent as more frame. + + the IOutgoingSocket to transmit on + the routing key to send + true if a message was available, otherwise false. + + + + Attempt to transmit routing key over . + If message cannot be sent within , return false. + Routing is always sent as more frame. + + the IOutgoingSocket to transmit on + The maximum period of time to try to send a message. + the routing key to send + true if a message was available, otherwise false. + + + + Send empty list of routing keys over , append an empty message at the end of the keys. + + the IOutgoingSocket to transmit on + + + + Send a single routing key over , append an empty message afterwards. + + the IOutgoingSocket to transmit on + the routing keys to send + + + + Send routing keys over , append an empty message at the end of the keys. + + the IOutgoingSocket to transmit on + the routing keys to send + + + + Attempt to transmit routing keys over . + If message cannot be sent immediately, return false. + Routing is always sent as more frame. + + the IOutgoingSocket to transmit on + the routing keys to send + true if a message was available, otherwise false. + + + + Attempt to transmit routing key over . + If message cannot be sent within , return false. + Routing is always sent as more frame. + + the IOutgoingSocket to transmit on + The maximum period of time to try to send a message. + the routing keys to send + true if a message was available, otherwise false. + + + + This flags enum-type is simply an indication of the direction of the poll-event, + and can be None, PollIn, PollOut, or PollError. + + + + + No events + + + + + Check for incoming + + + + + Check if ready for outgoing + + + + + Check if error is ready to be read + + + + + Extension methods for the enum. + + + + Test whether has the flag set. + + + Test whether has the flag set. + + + Test whether has the flag set. + + + + Forwards messages bidirectionally between two sockets. You can also specify a control socket tn which proxied messages will be sent. + + + This class must be explicitly started by calling . If an external has been specified, + then that call will block until is called. + + If using an external , ensure the front and back end sockets have been added to it. + + Users of this class must call when messages should no longer be proxied. + + + + + Create a new instance of a Proxy (NetMQ.Proxy) + with the given sockets to serve as a front-end, a back-end, and a control socket. + + the socket that messages will be forwarded from + the socket that messages will be forwarded to + this socket will have incoming messages also sent to it - you can set this to null if not needed + this socket will have outgoing messages also sent to it - you can set this to null if not needed + an optional external poller to use within this proxy + + + + Create a new instance of a Proxy (NetMQ.Proxy) + with the given sockets to serve as a front-end, a back-end, and a control socket. + + the socket that messages will be forwarded from + the socket that messages will be forwarded to + this socket will have messages also sent to it - you can set this to null if not needed + an optional external poller to use within this proxy + is not null and either or are not contained within it. + + + + Start proxying messages between the front and back ends. Blocks, unless using an external . + + The proxy has already been started. + + + + Stops the proxy, blocking until the underlying has completed. + + The proxy has not been started. + + + + Receive methods for thread-safe sockets that support receiving + + + + + Receive a bytes from , blocking until one arrives. + + The socket to receive from. + The token to monitor for cancellation requests. The default value is . + The content of the received message. + The token has had cancellation requested. + + + + Attempt to receive a byte-array . + If no message is immediately available, return false. + + The socket to receive from. + The content of the received message, or null if no message was available. + true if a message was available, otherwise false. + + + + Attempt to receive a byte-array . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + The content of the received message, or null if no message was available. + The token to monitor for cancellation requests. The default value is . + true if a message was available, otherwise false. + The method would return false if cancellation has had requested. + + + + Receive a bytes from asynchronously. + + The socket to receive from. + The token to monitor for cancellation requests. The default value is . + The content of the received message. + The token has had cancellation requested. + + + + Receive a string from , blocking until one arrives, and decode using . + + The socket to receive from. + The token to monitor for cancellation requests. The default value is . + The content of the received message. + The token has had cancellation requested. + + + + Receive a string from , blocking until one arrives, and decode using . + + The socket to receive from. + The encoding used to convert the data to a string. + The token to monitor for cancellation requests. The default value is . + The content of the received message. + The token has had cancellation requested. + + + + Attempt to receive a string from , and decode using . + If no message is immediately available, return false. + + The socket to receive from. + The content of the received message, or null if no message was available. + true if a message was available, otherwise false. + + + + Attempt to receive a string from , and decode using . + If no message is immediately available, return false. + + The socket to receive from. + The encoding used to convert the data to a string. + The content of the received message, or null if no message was available. + true if a message was available, otherwise false. + + + + Attempt to receive a string from , and decode using . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + The conent of the received message, or null if no message was available. + The token to monitor for cancellation requests. The default value is . + true if a message was available, otherwise false. + The method would return false if cancellation has had requested. + + + + Attempt to receive a string from , and decode using . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + The encoding used to convert the data to a string. + The content of the received message, or null if no message was available. + The token to monitor for cancellation requests. The default value is . + true if a message was available, otherwise false. + The method would return false if cancellation has had requested. + + + + Receive a string from asynchronously. + + The socket to receive from. + The token to monitor for cancellation requests. The default value is . + The content of the received message. + The token has had cancellation requested. + + + + Provides extension methods for the interface, + via which messages may be received in several ways. + + + + + Block until the next message arrives, then make the message's data available via . + + + The call blocks until the next message arrives, and cannot be interrupted. This a convenient and safe when + you know a message is available, such as for code within a callback. + + The socket to receive from. + An object to receive the message's data into. + + + + Receive a single frame from , blocking until one arrives. + + The socket to receive from. + The content of the received message frame. + + + + Receive a single frame from , blocking until one arrives. + Indicate whether further frames exist via . + + The socket to receive from. + true if another frame of the same message follows, otherwise false. + The content of the received message frame. + + + + Attempt to receive a single frame from . + If no message is immediately available, return false. + + The socket to receive from. + The content of the received message frame, or null if no message was available. + true if a message was available, otherwise false. + + + + Attempt to receive a single frame from . + If no message is immediately available, return false. + Indicate whether further frames exist via . + + The socket to receive from. + true if another frame of the same message follows, otherwise false. + The content of the received message frame, or null if no message was available. + true if a message was available, otherwise false. + + + + Attempt to receive a single frame from . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + The content of the received message frame, or null if no message was available. + true if a message was available, otherwise false. + + + + Attempt to receive a single frame from . + If no message is available within , return false. + Indicate whether further frames exist via . + + The socket to receive from. + true if another frame of the same message follows, otherwise false. + The maximum period of time to wait for a message to become available. + The content of the received message frame, or null if no message was available. + true if a message was available, otherwise false. + + + + Receive all frames of the next message from , blocking until a message arrives. + + The socket to receive from. + Optional initial for the returned . + All frames of a multipart message as a list having one or more items. + + + + Receive all frames of the next message from , blocking until a message arrives. + + The socket to receive from. + Reference to a list for return values. If null a new instance will be assigned, otherwise the provided list will be cleared and populated. + Optional initial for the returned . + + + + Attempt to receive all frames of the next message from . + If no message is immediately available, return false. + + The socket to receive from. + Reference to a list for return values. If null a new instance will be assigned, otherwise the provided list will be cleared and populated. + Optional initial for the returned . + + + + Attempt to receive all frames of the next message from . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + Reference to a list for return values. If null a new instance will be assigned, otherwise the provided list will be cleared and populated. + Optional initial for the returned . + + + + Receive a single frame from , blocking until one arrives, and decode as a string using . + + The socket to receive from. + The content of the received message frame as a string. + + + + Receive a single frame from , blocking until one arrives, and decode as a string using . + Indicate whether further frames exist via . + + The socket to receive from. + true if another frame of the same message follows, otherwise false. + The content of the received message frame. + + + + Receive a single frame from , blocking until one arrives, and decode as a string using . + + The socket to receive from. + The encoding used to convert the frame's data to a string. + The content of the received message frame as a string. + + + + Receive a single frame from , blocking until one arrives, and decode as a string using . + Indicate whether further frames exist via . + + The socket to receive from. + The encoding used to convert the frame's data to a string. + true if another frame of the same message follows, otherwise false. + The content of the received message frame as a string. + + + + Attempt to receive a single frame from , and decode as a string using . + If no message is immediately available, return false. + + The socket to receive from. + The content of the received message frame as a string, or null if no message was available. + true if a message was available, otherwise false. + + + + Attempt to receive a single frame from , and decode as a string using . + If no message is immediately available, return false. + + The socket to receive from. + The content of the received message frame as a string, or null if no message was available. + true if another frame of the same message follows, otherwise false. + true if a message was available, otherwise false. + + + + Attempt to receive a single frame from , and decode as a string using . + If no message is immediately available, return false. + + The socket to receive from. + The encoding used to convert the frame's data to a string. + The content of the received message frame as a string, or null if no message was available. + true if a message was available, otherwise false. + + + + Attempt to receive a single frame from , and decode as a string using . + If no message is immediately available, return false. + + The socket to receive from. + The encoding used to convert the frame's data to a string. + The content of the received message frame as a string, or null if no message was available. + true if another frame of the same message follows, otherwise false. + true if a message was available, otherwise false. + + + + Attempt to receive a single frame from , and decode as a string using . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + The content of the received message frame as a string, or null if no message was available. + true if a message was available, otherwise false. + + + + Attempt to receive a single frame from , and decode as a string using . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + The content of the received message frame as a string, or null if no message was available. + true if another frame of the same message follows, otherwise false. + true if a message was available, otherwise false. + + + + Attempt to receive a single frame from , and decode as a string using . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + The encoding used to convert the frame's data to a string. + The content of the received message frame as a string, or null if no message was available. + true if a message was available, otherwise false. + + + + Attempt to receive a single frame from , and decode as a string using . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + The encoding used to convert the frame's data to a string. + The content of the received message frame as a string, or null if no message was available. + true if another frame of the same message follows, otherwise false. + true if a message was available, otherwise false. + + + + Receive all frames of the next message from , blocking until they arrive, and decode as strings using . + + The socket to receive from. + Specifies the initial capacity of the used + to buffer results. If the number of frames is known, set it here. If more frames arrive than expected, + an extra allocation will occur, but the result will still be correct. + The content of the received message frame as a string. + + + + Receive all frames of the next message from , blocking until they arrive, and decode as strings using . + + The socket to receive from. + The encoding used to convert the frame's data to a string. + Specifies the initial capacity of the used + to buffer results. If the number of frames is known, set it here. If more frames arrive than expected, + an extra allocation will occur, but the result will still be correct. + + + + Attempt to receive all frames of the next message from , and decode them as strings using . + If no message is immediately available, return false. + + The socket to receive from. + The frames of the received message as strings. Untouched if no message was available. + Specifies the initial capacity of the used + to buffer results. If the number of frames is known, set it here. If more frames arrive than expected, + an extra allocation will occur, but the result will still be correct. + true if a message was available, otherwise false. + + + + Attempt to receive all frames of the next message from , and decode them as strings using . + If no message is immediately available, return false. + + The socket to receive from. + The encoding used to convert the frame's data to a string. + The frames of the received message as strings. Untouched if no message was available. + Specifies the initial capacity of the used + to buffer results. If the number of frames is known, set it here. If more frames arrive than expected, + an extra allocation will occur, but the result will still be correct. + true if a message was available, otherwise false. + + + + Attempt to receive all frames of the next message from , and decode them as strings using . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + The frames of the received message as strings. Untouched if no message was available. + Specifies the initial capacity of the used + to buffer results. If the number of frames is known, set it here. If more frames arrive than expected, + an extra allocation will occur, but the result will still be correct. + true if a message was available, otherwise false. + + + + Attempt to receive all frames of the next message from , and decode them as strings using . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + The encoding used to convert the frame's data to a string. + The frames of the received message as strings. Untouched if no message was available. + Specifies the initial capacity of the used + to buffer results. If the number of frames is known, set it here. If more frames arrive than expected, + an extra allocation will occur, but the result will still be correct. + true if a message was available, otherwise false. + + + + Receive all frames of the next message from , blocking until they arrive. + + The socket to receive from. + Specifies the initial capacity of the used + to buffer results. If the number of frames is known, set it here. If more frames arrive than expected, + an extra allocation will occur, but the result will still be correct. + The content of the received message frame as a string. + + + + Attempt to receive all frames of the next message from . + If no message is immediately available, return false. + + The socket to receive from. + The received message. Untouched if no message was available. + Specifies the initial capacity of the used + to buffer results. If the number of frames is known, set it here. If more frames arrive than expected, + an extra allocation will occur, but the result will still be correct. + true if a message was available, otherwise false. + + + + Attempt to receive all frames of the next message from . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + The received message. Untouched if no message was available. + Specifies the initial capacity of the used + to buffer results. If the number of frames is known, set it here. If more frames arrive than expected, + an extra allocation will occur, but the result will still be correct. + true if a message was available, otherwise false. + + + + Receive frames from , blocking until a valid signal arrives. + + The socket to receive from. + true if the received signal was zero, otherwise false. + + + + Attempt to receive a valid signal from . + If no message is immediately available, return false. + + The socket to receive from. + true if the received signal was zero, otherwise false. If no signal received, false. + true if a valid signal was observed, otherwise false. + + + + Attempt to receive a valid signal from . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + true if the received signal was zero, otherwise false. If no signal received, false. + true if a valid signal was observed, otherwise false. + + + + Receive a single frame from , blocking until one arrives, then ignore its content. + + The socket to receive from. + + + + Receive a single frame from , blocking until one arrives, then ignore its content. + Indicate whether further frames exist via . + + The socket to receive from. + true if another frame of the same message follows, otherwise false. + + + + Attempt to receive a single frame from , then ignore its content. + If no message is immediately available, return false. + + The socket to receive from. + true if a frame was received and ignored, otherwise false. + + + + Attempt to receive a single frame from , then ignore its content. + If no message is immediately available, return false. + Indicate whether further frames exist via . + + The socket to receive from. + true if another frame of the same message follows, otherwise false. + true if a frame was received and ignored, otherwise false. + + + + Attempt to receive a single frame from , then ignore its content. + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + true if a frame was received and ignored, otherwise false. + + + + Attempt to receive a single frame from , then ignore its content. + If no message is available within , return false. + Indicate whether further frames exist via . + + The socket to receive from. + The maximum period of time to wait for a message to become available. + true if another frame of the same message follows, otherwise false. + true if a frame was received and ignored, otherwise false. + + + + Receive all frames of the next message from , blocking until a message arrives, then ignore their contents. + + The socket to receive from. + + + + Attempt to receive all frames of the next message from , then ignore their contents. + If no message is immediately available, return false. + + The socket to receive from. + true if a frame was received and ignored, otherwise false. + + + + Attempt to receive all frames of the next message from , then ignore their contents. + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + true if a frame was received and ignored, otherwise false. + + + + Receive a routing-key from , blocking until one arrives. + + The socket to receive from. + The routing key. + + + + Receive a routing-key from , blocking until one arrives. + Indicate whether further frames exist via . + + The socket to receive from. + true if another frame of the same message follows, otherwise false. + The routing key. + + + + Attempt to receive a routing-key from . + If no message is immediately available, return false. + + The socket to receive from. + The routing-key of the received message frame. + true if a message was available, otherwise false. + + + + Attempt to receive a routing-key from . + If no message is immediately available, return false. + Indicate whether further frames exist via . + + The socket to receive from. + true if another frame of the same message follows, otherwise false. + The routing-key of the received message frame. + true if a message was available, otherwise false. + + + + Attempt to receive a routing-key from . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + The routing-key of the received message frame. + true if a message was available, otherwise false. + + + + Attempt to receive a routing-key from . + If no message is available within , return false. + Indicate whether further frames exist via . + + The socket to receive from. + true if another frame of the same message follows, otherwise false. + The maximum period of time to wait for a message to become available. + The routing-key of the received message frame. + true if a message was available, otherwise false. + + + + Receive routing keys from until a bottom message arrives (empty message), blocking until one arrives. + + The socket to receive from. + The routing keys. + + + + Attempt to receive routing-keys from , an empty message expected at the end of routing keys. + If no message is immediately available, return false. + + The socket to receive from. + The routing-keys of the received message. + true if a message was available, otherwise false. + + + + Attempt to receive a routing-keys from . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + The routing-keys of the received message. + true if a message was available, otherwise false. + + + + Send and Receive extensions for sockets with RoutingId capability (ServerSocket) + + + + + Transmit a byte-array of data over this socket, block until message is sent. + + the socket to transmit on + Routing id + the byte-array of data to send + + + + Transmit a byte-array of data over this socket, block until frame is sent. + + the socket to transmit on + Routing id + the byte-array of data to send + the number of bytes to send from . + + + + Attempt to transmit a byte-array of data on . + If message cannot be sent within , return false. + + the socket to transmit on + The maximum period of time to try to send a message. + Routing id + the byte-array of data to send + the number of bytes to send from . + true if a message was available, otherwise false. + + + + Attempt to transmit a byte-array of data on . + If message cannot be sent within , return false. + + the socket to transmit on + The maximum period of time to try to send a message. + Routing id + the byte-array of data to send + true if a message was available, otherwise false. + + + + Attempt to transmit a byte-array of data on . + If message cannot be sent immediately, return false. + + the socket to transmit on + Routing id + the byte-array of data to send + true if a message was available, otherwise false. + + + + Attempt to transmit a single frame on . + If message cannot be sent immediately, return false. + + the socket to transmit on + Routing id + the byte-array of data to send + the number of bytes to send from . + true if a message was available, otherwise false. + + + + Transmit a byte-array of data over this socket asynchronously. + + the socket to transmit on + Routing id + the byte-array of data to send + + + + Transmit a byte-array of data over this socket asynchronously. + + the socket to transmit on + Routing id + the byte-array of data to send + the number of bytes to send from . + + + + Transmit a string over this socket, block until message is sent. + + the socket to transmit on + Routing id + the string to send + + + + Attempt to transmit a single string frame on . + If message cannot be sent within , return false. + + the socket to transmit on + The maximum period of time to try to send a message. + Routing id + the string to send + true if a message was available, otherwise false. + + + + Attempt to transmit a single string frame on . + If message cannot be sent immediately, return false. + + the socket to transmit on + Routing id + the string to send + true if a message was available, otherwise false. + + + + Transmit a string over this socket asynchronously. + + the socket to transmit on + Routing id + the string to send + + + + Receive a bytes from , blocking until one arrives. + + The socket to receive from. + The token to monitor for cancellation requests. The default value is . + Tuple of routing id and received bytes + The token has had cancellation requested. + + + + Attempt to receive a byte-array . + If no message is immediately available, return false. + + The socket to receive from. + Routing id + The content of the received message, or null if no message was available. + true if a message was available, otherwise false. + + + + Attempt to receive a byte-array . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + Routing id + The content of the received message, or null if no message was available. + The token to monitor for cancellation requests. The default value is . + true if a message was available, otherwise false. + The method would return false if cancellation has had requested. + + + + Receive a bytes from asynchronously. + + The socket to receive from. + The token to monitor for cancellation requests. The default value is . + Tuple of routing id and received bytes + The token has had cancellation requested. + + + + Receive a string from , blocking until one arrives, and decode using . + + The socket to receive from. + The token to monitor for cancellation requests. The default value is . + Tuple of routing id and the content of the received message as a string. + The token has had cancellation requested. + + + + Receive a string from , blocking until one arrives, and decode using . + + The socket to receive from. + The encoding used to convert the data to a string. + The token to monitor for cancellation requests. The default value is . + Tuple of routing id and the content of the received message as a string. + The token has had cancellation requested. + + + + Attempt to receive a string from , and decode using . + If no message is immediately available, return false. + + The socket to receive from. + Routing id + The content of the received message as a string, or null if no message was available. + true if a message was available, otherwise false. + + + + Attempt to receive a string from , and decode using . + If no message is immediately available, return false. + + The socket to receive from. + The encoding used to convert the data to a string. + Routing id + The content of the received message as a string, or null if no message was available. + true if a message was available, otherwise false. + + + + Attempt to receive a string from , and decode using . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + Routing id + The content of the received message as a string, or null if no message was available. + The token to monitor for cancellation requests. The default value is . + true if a message was available, otherwise false. + The method would return false if cancellation has had requested. + + + + Attempt to receive a string from , and decode using . + If no message is available within , return false. + + The socket to receive from. + The maximum period of time to wait for a message to become available. + The encoding used to convert the data to a string. + Routing id + The content of the received message as a string, or null if no message was available. + The token to monitor for cancellation requests. The default value is . + true if a message was available, otherwise false. + The method would return false if cancellation has had requested. + + + + Receive a string from asynchronously. + + The socket to receive from. + The token to monitor for cancellation requests. The default value is . + Tuple of routing id and a string + The token has had cancellation requested. + + + + Structure to represent a routing key from Router, Peer and Stream sockets. + Implement Equals and GetHashCode and can be used as key for a Dictionary. + + + + + Create a new routing key out of a byte array + + + + + + Create a new routing key out of a base64 string + + + + + + Create a new routing key out of a Int64 + + + + + + Check if routing-key is equal to the object + + Object to compare against, valid types are byte-array and RoutingKey + True if equals, otherwise false + + + + Check if routing-key is equal to the byte-array + + Byte-array to compare against + True if equals, otherwise false + + + + Check if routing-key is equal to another routing-key + + Other routing key to check against + True if equals, otherwise false + + + + Return a numeric hashcode of the given byte-array. + + an integer that contains a hashcode computed over the byte-array + + + + Convert the routing-key to base64 string + + Base64 string representation of the routing-key + + + + Constants for the send and receive operation + + + + + The used in string related methods that do + not explicitly provide an encoding parameter. + + + + Indicates an infinite timeout for send and receive operations. + + + + Send extension methods for thread-safe sockets that support sending + + + + + Transmit a byte-array of data over this socket, block until message is sent. + + the socket to transmit on + the byte-array of data to send + + + + Transmit a byte-array of data over this socket, block until message is sent. + + the socket to transmit on + the byte-array of data to send + the number of bytes to send from . + + + + Attempt to transmit a byte-array of data on . + If message cannot be sent within , return false. + + the socket to transmit on + The maximum period of time to try to send a message. + the byte-array of data to send + the number of bytes to send from . + true if a message was available, otherwise false. + + + + Attempt to transmit a byte-array of data on . + If message cannot be sent within , return false. + + the socket to transmit on + The maximum period of time to try to send a message. + the byte-array of data to send + true if a message was available, otherwise false. + + + + Attempt to transmit a byte-array of data on . + If message cannot be sent immediately, return false. + + the socket to transmit on + the byte-array of data to send + true if a message was available, otherwise false. + + + + Attempt to transmit a byte-array on . + If message cannot be sent immediately, return false. + + the socket to transmit on + the byte-array of data to send + the number of bytes to send from . + true if a message was available, otherwise false. + + + + Transmit a byte-array of data over this socket asynchronously. + + the socket to transmit on + the byte-array of data to send + + + + Transmit a byte-array of data over this socket asynchronously. + + the socket to transmit on + the byte-array of data to send + the number of bytes to send from . + + + + Transmit a string over this socket, block until message is sent. + + the socket to transmit on + the string to send + + + + Attempt to transmit a single string on . + If message cannot be sent within , return false. + + the socket to transmit on + The maximum period of time to try to send a message. + the string to send + true if a message was available, otherwise false. + + + + Attempt to transmit a single string on . + If message cannot be sent immediately, return false. + + the socket to transmit on + the string to send + true if a message was available, otherwise false. + + + + Transmit a string over this socket asynchronously. + + the socket to transmit on + the string to send + + + + This enum-type specifies socket transport events (TCP and IPC only). + + + + + Socket got connected + + + + + Connect delayed + + + + + Connect Retried + + + + + Socket is listening + + + + + Socket bind failed + + + + + Peer is accepted + + + + + Accept failed + + + + + Socket is closed + + + + + Failed to close socket + + + + + Socket disconnected + + + + + Listen to all events + + + + + A SocketOptions is simply a convenient way to access the options of a particular socket. + This class holds a reference to the socket, and its properties provide a concise way + to access that socket's option values -- instead of calling GetSocketOption/SetSocketOption. + + + + + The NetMQSocket that this SocketOptions is referencing. + + + + + Create a new SocketOptions that references the given NetMQSocket. + + the NetMQSocket for this SocketOptions to hold a reference to + + + + Get or set the I/O-thread affinity. This is a 64-bit value used to specify which threads from the I/O thread-pool + associated with the socket's context shall handle newly-created connections. + 0 means no affinity, meaning that work shall be distributed fairly among all I/O threads. + For non-zero values, the lowest bit corresponds to thread 1, second lowest bit to thread 2, and so on. + + + + + Get or set unique identity of the socket, from a message-queueing router's perspective. + This is a byte-array of at most 255 bytes. + + + + + Get or set the maximum send or receive data rate for multicast transports on the specified socket. + + + + + Get or set the recovery-interval for multicast transports using the specified socket. + This option determines the maximum time that a receiver can be absent from a multicast group + before unrecoverable data loss will occur. Default is 10,000 ms (10 seconds). + + + + + Get or set the size of the transmit buffer for the specified socket. + + + + + Get or set the size of the receive buffer for the specified socket. + A value of zero means that the OS default is in effect. + + + + + Gets whether the last frame received on the socket had the more flag set or not. + + true if receive more; otherwise, false. + + + + Get or set the linger period for the specified socket, + which determines how long pending messages which have yet to be sent to a peer + shall linger in memory after a socket is closed. + + + If socket created with Context default is -1 if socket created without socket (using new keyword) default is zero. + If context is used this also affects the termination of context, otherwise this affects the exit of the process. + -1: Specifies an infinite linger period. Pending messages shall not be discarded after the socket is closed; + attempting to terminate the socket's context shall block until all pending messages have been sent to a peer. + 0: Specifies no linger period. Pending messages shall be discarded immediately when the socket is closed. + Positive values specify an upper bound for the linger period. Pending messages shall not be discarded after the socket is closed; + attempting to terminate the socket's context shall block until either all pending messages have been sent to a peer, + or the linger period expires, after which any pending messages shall be discarded. + + + + + Get or set the initial reconnection interval for the specified socket. + This is the period to wait between attempts to reconnect disconnected peers + when using connection-oriented transports. The default is 100 ms. + -1 means no reconnection. + + + With ZeroMQ, the reconnection interval may be randomized to prevent reconnection storms + in topologies with a large number of peers per socket. + + + + + Get or set the maximum reconnection interval for the specified socket. + This is the maximum period to shall wait between attempts + to reconnect. On each reconnect attempt, the previous interval shall be doubled + until this maximum period is reached. + The default value of zero means no exponential backoff is performed. + + + This is the maximum period NetMQ shall wait between attempts + to reconnect. On each reconnect attempt, the previous interval shall be doubled + until this maximum period is reached. + This allows for an exponential backoff strategy. + The default value of zero means no exponential backoff is performed + and reconnect interval calculations are only based on ReconnectIvl. + + + + + Get or set the maximum length of the queue of outstanding peer connections + for the specified socket. This only applies to connection-oriented transports. + Default is 100. + + + + + Get or set the upper limit to the size for inbound messages. + If a peer sends a message larger than this it is disconnected. + The default value is -1, which means no limit. + + + + + Get or set the high-water-mark for transmission. + This is a hard limit on the number of messages that are allowed to queue up + before mitigative action is taken. + The default is 1000. + + + + + Get or set the high-water-mark for reception. + This is a hard limit on the number of messages that are allowed to queue up + before mitigative action is taken. + The default is 1000. + + + + + The low-water mark for message transmission. + This is the number of messages that should be processed before transmission is + unblocked (in case it was blocked by reaching high-watermark). The default value is + calculated using relevant high-watermark (HWM): HWM > 2048 ? HWM - 1024 : (HWM + 1) / 2 + + + + + The low-water mark for message reception. + This is the number of messages that should be processed before reception is + unblocked (in case it was blocked by reaching high-watermark). The default value is + calculated using relevant high-watermark (HWM): HWM > 2048 ? HWM - 1024 : (HWM + 1) / 2 + + + + + Get or set the time-to-live (maximum number of hops) that outbound multicast packets + are allowed to propagate. + The default value of 1 means that the multicast packets don't leave the local network. + + + + + Get or set whether the underlying socket is for IPv4 only (not IPv6), + as opposed to one that allows connections with either IPv4 or IPv6. + + + + + Get the last endpoint bound for TCP and IPC transports. + The returned value will be a string in the form of a ZMQ DSN. + + + If the TCP host is ANY, indicated by a *, then the returned address + will be 0.0.0.0 (for IPv4). + + + + + Set the RouterSocket behavior when an unroutable message is encountered. + A value of false is the default and discards the message silently when it cannot be routed. + A value of true causes throw of HostUnreachableException if the message cannot be routed. + + + + + Get or set whether to use TCP keepalive. + + + When Keepalive is enabled, then your socket will periodically send an empty keepalive probe packet + with the ACK flag on. The remote endpoint does not need to support keepalive at all, just TCP/IP. + If you receive a reply to your keepalive probe, you can assume that the connection is still up and running. + This procedure is useful because if the other peers lose their connection (for example, by rebooting) + you will notice that the connection is broken, even if you don't have traffic on it. + If the keepalive probes are not replied to by your peer, you can assert that the connection + cannot be considered valid and then take the corrective action. + + + + + Get or set the keep-alive time - the duration between two keepalive transmissions in idle condition. + The TCP keepalive period is required by socket implementers to be configurable and by default is + set to no less than 2 hours. + + + + + Get or set the TCP keep-alive interval - the duration between two keepalive transmission if no response was received to a previous keepalive probe. + + + By default a keepalive packet is sent every 2 hours or 7,200,000 milliseconds + (TODO: Check these comments concerning default values! jh) + if no other data have been carried over the TCP connection. + If there is no response to a keepalive, it is repeated once every KeepAliveInterval seconds. + The default is one second. + + + + + Get or set the attach-on-connect value. + If set to true, this will delay the attachment of a pipe on connect until + the underlying connection has completed. This will cause the socket + to block if there are no other connections, but will prevent queues + from filling on pipes awaiting connection. + Default is false. + + + + + This applies only to publisher sockets. + Set whether to send all subscription messages upstream, not just unique ones. + The default is false. + + + + + This applies only to publisher sockets. + Set whether to support broadcast functionality + + + + + This applies only to router sockets. + Set whether RouterSocket allows non-zmq tcp connects. + If true, router socket accepts non-zmq tcp connections + + + + + When enabled new router connections with same identity take over old ones + + + + + Get or set the byte-order: big-endian, vs little-endian. + + + + + Enable Manual Publisher, Publisher won't add subscription automatically, + Subscribe must be called on the socket to add subscription. + + + + + Disable socket time-wait + + + + + Get the last PEER allocated routing id + + + + + Controls the maximum datagram size for PGM. + + + + + Defines whether the socket will act as server for CURVE security. + A value of true means the socket will act as CURVE server. + A value of false means the socket will not act as CURVE server, and its security role then depends on other option settings. + Setting this to false shall reset the socket security to NULL. + When you set this you must also set the server's secret key. A server socket does not need to know its own public key. + + + + + Sets the socket's long term curve key pair. + You must set this on both CURVE client and server sockets. + You can provide the key as 32 binary bytes. + To generate a certificate, use . + + + + + Sets the socket's long term server key. + You must set this on CURVE client sockets. + You can provide the key as 32 binary bytes. + This key must have been generated together with the server's secret key. + To generate a public/secret key pair, use . + + + + + Sets the socket's long term server certificate. + You must set this on CURVE client sockets. + You can provide the key as 32 binary bytes. + This key must have been generated together with the server's secret key. + To generate a certificate, use . + + + + + If remote peer receives a PING message and doesn't receive another + message within the ttl value, it should close the connection + (measured in tenths of a second) + + + + + Time in milliseconds between sending heartbeat PING messages. + + + + + Time in milliseconds to wait for a PING response before disconnecting + + + + + Set message to send to peer upon connecting + + + + + relax strict alternation between request and reply on REQ sockets + + + + + match replies with requests on REQ sockets + + + + + Client socket, thread-safe alternative for Dealer socket + + + + + Create a new Client Socket. + + + + + A DealerSocket is a NetMQSocket, whereby the dealer sends messages in a way intended to achieve load-balancing + - which are received in a fair queueing manner. + + + + + Create a new DealerSocket and attach socket to zero or more endpoints. + + List of NetMQ endpoints, separated by commas and prefixed by '@' (to bind the socket) or '>' (to connect the socket). + Default action is connect (if endpoint doesn't start with '@' or '>') + var socket = new DealerSocket(">tcp://127.0.0.1:5555,@tcp://127.0.0.1:55556"); + + + + Create a new DealerSocket based upon the given SocketBase. + + the SocketBase to create the new socket from + + + + Dish socket, thread-safe alternative for SUB socket + + + + + Create a new Client Socket. + + + + + Join the dish socket to a group + + The group to join + + + + Leave a group for a dish socket + + The group leave + + + + Gather socket, thread-safe alternative for Pull socket + + + + + Create a new Gather Socket. + + + + + A PairSocket is a NetMQSocket, usually used to synchronize two threads - using only one socket on each side. + + + + + Create a new PairSocket and attach socket to zero or more endpoints. + + List of NetMQ endpoints, separated by commas and prefixed by '@' (to bind the socket) or '>' (to connect the socket). + Default action is connect (if endpoint doesn't start with '@' or '>') + var socket = new PairSocket(">tcp://127.0.0.1:5555,@tcp://127.0.0.1:55556"); + + + + Create a new PairSocket based upon the given SocketBase. + + the SocketBase to create the new socket from + + + + Create and return an inproc pipe where socket1 is bound and socket2 is connected. + + the Bind socket + the Connect socket + + + + Create and return an inproc pipe where socket1 is bound and socket2 is connected. + + the Bind socket + the Connect socket + Method to initialize socket1 before connection + Method to initialize socket2 before connection + + + + Peer socket, the first message is always the identity of the sender + + + + + Create a new PeerSocket and attach socket to zero or more endpoints. + + List of NetMQ endpoints, separated by commas and prefixed by '@' (to bind the socket) or '>' (to connect the socket). + Default action is connect (if endpoint doesn't start with '@' or '>') + var socket = new PeerSocket(">tcp://127.0.0.1:5555,>tcp://127.0.0.1:55556"); + + + + Create a new PeerSocket based upon the given SocketBase. + + the SocketBase to create the new socket from + + + + Connect the peer socket to . + + a string denoting the address to connect this socket to + The peer allocated routing id + thrown if the socket was already disposed + The socket has been stopped. + No IO thread was found. + The specified address is already in use. + + + + A PublisherSocket is a NetMQSocket intended to be used as the Pub in the PubSub pattern. + The intended usage is for publishing messages to all subscribers which are subscribed to a given topic. + + + + + Create a new PublisherSocket and attach socket to zero or more endpoints. + + List of NetMQ endpoints, separated by commas and prefixed by '@' (to bind the socket) or '>' (to connect the socket). + Default action is bind (if endpoint doesn't start with '@' or '>') + var socket = new PublisherSocket(">tcp://127.0.0.1:5555,>tcp://127.0.0.1:55556"); + + + + Create a new PublisherSocket based upon the given SocketBase. + + the SocketBase to create the new socket from + + + doesn't support sending, so this override throws . + Receive is not supported. + + + + A PullSocket is a NetMQSocket intended to be used as the "Pull" part of the Push-Pull pattern. + This will "pull" messages that have been pushed from the "push" socket. + + + + + Create a new PullSocket and attach socket to zero or more endpoints. + + List of NetMQ endpoints, separated by commas and prefixed by '@' (to bind the socket) or '>' (to connect the socket). + Default action is bind (if endpoint doesn't start with '@' or '>') + var socket = new PullSocket(">tcp://127.0.0.1:5555,>tcp://127.0.0.1:55556"); + + + + Create a new PullSocket based upon the given SocketBase. + + the SocketBase to create the new socket from + + + + + + + A PushSocket is a NetMQSocket intended to be used as the "Push" part of the Push-Pull pattern. + This will "push" messages to be pulled by the "pull" socket. + + + + + Create a new PushSocket and attach socket to zero or more endpoints. + + List of NetMQ endpoints, separated by commas and prefixed by '@' (to bind the socket) or '>' (to connect the socket). + Default action is connect (if endpoint doesn't start with '@' or '>') + var socket = new PushSocket(">tcp://127.0.0.1:5555,@tcp://127.0.0.1:55556"); + + + + Create a new PushSocket based upon the given SocketBase. + + the SocketBase to create the new socket from + + + doesn't support sending, so this override throws . + Receive is not supported. + + + + Radio socket, thread-safe alternative for PUB socket + + + + + Create a new Client Socket. + + + + + A RequestSocket is a NetMQSocket intended to be used as the Request part of the Request-Response pattern. + This is generally paired with a ResponseSocket. + + + + + Create a new RequestSocket and attach socket to zero or more endpoints. + + List of NetMQ endpoints, separated by commas and prefixed by '@' (to bind the socket) or '>' (to connect the socket). + Default action is connect (if endpoint doesn't start with '@' or '>') + var socket = new RequestSocket(">tcp://127.0.0.1:5555,@tcp://127.0.0.1:55556"); + + + + Create a new RequestSocket based upon the given SocketBase. + + the SocketBase to create the new socket from + + + + Try to send request message and return the response as a message, or return null if not successful + + a string denoting the address to connect to + The request message + The number of times to try + The timeout for each request + Report topics: Failure, Retry, Send, Success + the response message, or null if not successful + + + + Try to send request string and return the response string, or return null if not successful + + a string denoting the address to connect to + The request string + The number of times to try + The timeout for each request + Report topics: Failure, Retry, Send, Success + the response message, or null if not successful + + + + A ResponseSocket is a NetMQSocket intended to be used as the Response part of the Request-Response pattern. + This is generally paired with a RequestSocket. + + + + + Create a new ResponseSocket and attach socket to zero or more endpoints. + + List of NetMQ endpoints, separated by commas and prefixed by '@' (to bind the socket) or '>' (to connect the socket). + Default action is bind (if endpoint doesn't start with '@' or '>') + var socket = new ResponseSocket(">tcp://127.0.0.1:5555,>tcp://127.0.0.1:55556"); + + + + Create a new ResponseSocket based upon the given SocketBase. + + the SocketBase to create the new socket from + + + + Router socket, the first message is always the identity of the sender + + + + + Create a new RouterSocket and attach socket to zero or more endpoints. + + List of NetMQ endpoints, separated by commas and prefixed by '@' (to bind the socket) or '>' (to connect the socket). + Default action is bind (if endpoint doesn't start with '@' or '>') + var socket = new RouterSocket(">tcp://127.0.0.1:5555,>tcp://127.0.0.1:55556"); + + + + Create a new RouterSocket based upon the given SocketBase. + + the SocketBase to create the new socket from + + + + Scatter socket, thread-safe alternative for Push socket + + + + + Create a new Scatter Socket. + + + + + Server socket, thread-safe alternative to socket. + + + + + Create a new Server Socket. + + + + + This is a NetMQSocket but provides no additional functionality. + You can use it when you need an instance that is a NetMQSocket + but with none of the distinguishing behavior of any of the other socket types. + + + This is provided because NetMQSocket is an abstract class, so you cannot instantiate it directly. + + + + + Create a new StreamSocket and attach socket to zero or more endpoints. + + List of NetMQ endpoints, separated by commas and prefixed by '@' (to bind the socket) or '>' (to connect the socket). + Default action is connect (if endpoint doesn't start with '@' or '>') + var socket = new StreamSocket(">tcp://127.0.0.1:5555,@tcp://127.0.0.1:55556"); + + + + Create a new StreamSocket based upon the given SocketBase. + + the SocketBase to create the new socket from + + + + A SubscriberSocket is a NetMQSocket intended to be used as the "Sub" in the PubSub pattern. + The intended usage is to receive messages from the publisher socket. + + + + + Create a new SubscriberSocket and attach socket to zero or more endpoints. + + List of NetMQ endpoints, separated by commas and prefixed by '@' (to bind the socket) or '>' (to connect the socket). + Default action is connect (if endpoint doesn't start with '@' or '>') + var socket = new SubscriberSocket(">tcp://127.0.0.1:5555,@tcp://127.0.0.1:55556"); + + + + Create a new SubscriberSocket based upon the given SocketBase. + + the SocketBase to create the new socket from + + + + + + + Subscribe this socket to the given 'topic' - which means enable this socket to receive + messages that begin with this string prefix. + You can set topic to an empty string to subscribe to everything. + + this specifies what text-prefix to subscribe to, or may be an empty-string to specify ALL + + + + Subscribe this socket to the given 'topic' - which means enable this socket to receive + messages that begin with this string prefix, using the given Encoding. + You can set topic to an empty string to subscribe to everything. + + this specifies what text-prefix to subscribe to, or may be an empty-string to specify ALL + the character-Encoding to use when converting the topic string internally into a byte-array + + + + Subscribe this socket to the given 'topic' - which means enable this socket to receive + messages that begin with this array of bytes. + + this specifies what byte-array prefix to subscribe to + + + + Subscribe this socket to all topics - which means enable this socket to receive + all messages regardless of what the string prefix is. + This is the same as calling Subscribe with an empty-string for the topic. + + + + + Remove this socket's subscription to the given topic. + + a string denoting which the topic to stop receiving + + + + Remove this socket's subscription to the given topic. + + a string denoting which the topic to stop receiving + the Encoding to use when converting the topic string internally into a byte-array + + + + Remove this socket's subscription to the given topic. + + a byte-array denoting which the topic to stop receiving + + + + An XPublisherSocket is a NetMQSocket intended to be used as the XPub in the XPub/XSub pattern. + The intended usage is for serving, together with a matching XSubscriberSocket, + as a stable intermediary between a PublisherSocket and it's SubscriberSockets. + + + + + Create a new XPublisherSocket and attach socket to zero or more endpoints. + + List of NetMQ endpoints, separated by commas and prefixed by '@' (to bind the socket) or '>' (to connect the socket). + Default action is bind (if endpoint doesn't start with '@' or '>') + var socket = new XPublisherSocket(">tcp://127.0.0.1:5555,>tcp://127.0.0.1:55556"); + + + + Create a new XPublisherSocket based upon the given . + + the SocketBase to create the new socket from + + + + In case of socket set to manual mode will subscribe the last subscriber to the topic + + a string specifying the Topic to subscribe to + + + + In case of socket set to manual mode will subscribe the last subscriber to the topic + + a string specifying the Topic to subscribe to + the character-Encoding to use when converting the topic string internally into a byte-array + + + + In case of socket set to manual mode will subscribe the last subscriber to the topic + + a byte-array specifying the Topic to subscribe to + + + + In case of socket set to manual mode will unsubscribe the last subscriber from a topic + + a string specifying the Topic to unsubscribe from + + + + In case of socket set to manual mode will unsubscribe the last subscriber from a topic + + a string specifying the Topic to unsubscribe from + the character-Encoding to use when converting the topic string internally into a byte-array + + + + In case of socket set to manual mode will unsubscribe the last subscriber from a topic + + a byte-array specifying the Topic to unsubscribe from + + + + Publisher sockets generally send a welcome-message to subscribers to give an indication that they have successful subscribed. + This method clears that message, such that none is sent. + + + + + Publisher sockets send a welcome-message to subscribers to give an indication that they have successful subscribed. + This method is how you set the text of that welcome-message. + + a string denoting the new value for the welcome-message + the character-Encoding to use when converting the topic string internally into a byte-array + + + + Publisher sockets send a welcome-message to subscribers to give an indication that they have successful subscribed. + This method is how you set the text of that welcome-message. The Encoding is assumed to be ASCII. + + a string denoting the new value for the welcome-message + + + + Publisher sockets send a welcome-message to subscribers to give an indication that they have successful subscribed. + This method is how you set the text of that welcome-message. The Encoding is assumed to be ASCII. + + a byte-array denoting the new value for the welcome-message + + + + An XSubscriberSocket is a NetMQSocket intended to be used as the XSub in the XPub/XSub pattern. + The intended usage is for serving, together with a matching XPublisherSocket, + as a stable intermediary between a PublisherSocket and it's SubscriberSockets. + + + + + Create a new XSubscriberSocket and attach socket to zero or more endpoints. + + List of NetMQ endpoints, separated by commas and prefixed by '@' (to bind the socket) or '>' (to connect the socket). + Default action is connect (if endpoint doesn't start with '@' or '>') + var socket = new XSubscriberSocket(">tcp://127.0.0.1:5555,@tcp://127.0.0.1:55556"); + + + + Create a new XSubscriberSocket based upon the given SocketBase. + + the SocketBase to create the new socket from + + + + Subscribe this socket to the given 'topic' - which means enable this socket to receive + messages that begin with this string prefix. + You can set topic to an empty string to subscribe to everything. + + this specifies what text-prefix to subscribe to, or may be an empty-string to specify ALL + + + + Subscribe this socket to the given 'topic' - which means enable this socket to receive + messages that begin with this string prefix, using the given Encoding. + You can set topic to an empty string to subscribe to everything. + + this specifies what text-prefix to subscribe to, or may be an empty-string to specify ALL + the Encoding to use when converting the topic string internally into a byte-array + + + + Subscribe this socket to the given 'topic' - which means enable this socket to receive + messages that begin with this array of bytes. + + this specifies what byte-array prefix to subscribe to + + + + Subscribe this socket to all topics - which means enable this socket to receive + all messages regardless of what the string prefix is. + This is the same as calling Subscribe with an empty-string for the topic. + + + + + Remove this socket's subscription to the given topic. + + a string denoting which the topic to stop receiving + + + + Remove this socket's subscription to the given topic. + + a string denoting which the topic to stop receiving + the Encoding to use when converting the topic string internally into a byte-array + + + + Remove this socket's subscription to the given topic. + + a byte-array denoting which the topic to stop receiving + + + + Base interface for thread-safe sockets + + + + + Send a message if one is available within . + + An object with message's data to send. + The maximum length of time to try and send a message. If , no + wait occurs. + true if a message was sent, otherwise false. + + + Attempt to receive a message for the specified amount of time. + A reference to a instance into which the received message + data should be placed. + The maximum amount of time the call should wait for a message before returning. + The token to monitor for cancellation requests. The default value is . + true if a message was received before elapsed or cancellation was requested, + otherwise false. + + + + Tag interface to tag sockets that support sending + + + + + Tag interface to tag sockets that support receiving + + + + + Tag interface for sockets that send and receive messages with . + + + + + Tag interface to tag sockets that support sending a group message + + + + + Tag interface to tag sockets that support receiving a group message + + + + + Abstract base class for NetMQ's different thread-safe socket types. + + + Various options are available in this base class, though their affect can vary by socket type. + + + + + Creates a thread socket of type + + + + + + Get the Socket Options of this socket. + + + + + Send a message if one is available within . + + An object with message's data to send. + The maximum length of time to try and send a message. If , no + wait occurs. + true if a message was sent, otherwise false. + + + Attempt to receive a message for the specified amount of time. + A reference to a instance into which the received message + data should be placed. + The maximum amount of time the call should wait for a message before returning. + The token to monitor for cancellation requests. The default value is . + true if a message was received before elapsed, + otherwise false. + + + + Bind the socket to . + + a string representing the address to bind this socket to + thrown if the socket was already disposed + The socket has been stopped. + The specified address is already in use. + No IO thread was found, or the protocol's listener encountered an + error during initialisation. + + + Binds the specified TCP to an available port, assigned by the operating system. + the chosen port-number + thrown if the socket was already disposed + uses a protocol other than TCP. + The socket has been stopped. + The specified address is already in use. + No IO thread was found, or the protocol's listener errored during + initialisation. + + + + Connect the socket to . + + a string denoting the address to connect this socket to + thrown if the socket was already disposed + The socket has been stopped. + No IO thread was found. + The specified address is already in use. + + + + Disconnect this socket from . + + a string denoting the address to disconnect from + thrown if the socket was already disposed + The socket has been stopped. + Endpoint was not found and cannot be disconnected. + + + + Unbind this socket from . + + a string denoting the address to unbind from + thrown if the socket was already disposed + The socket has been stopped. + Endpoint was not found and cannot be disconnected. + + + Closes this socket, rendering it unusable. Equivalent to calling . + + + Closes this socket, rendering it unusable. Equivalent to calling . + + + Closes this socket, rendering it unusable. Equivalent to calling . + true if releasing managed resources + + + + Gets whether the object has been disposed. + + + + + Thread-safe socket extension methods + + + + + Block until the message can be sent. + + + The call blocks until the message can be sent and cannot be interrupted. + Whether the message can be sent depends on the socket type. + + Socket to transmit on + An object with message's data to send. + + + + Block until the next message arrives, then make the message's data available via . + + + The call blocks until the next message arrives, and cannot be interrupted. This a convenient and safe when + you know a message is available, such as for code within a callback. + + Socket to transmit on + An object to receive the message's data into. + The token to monitor for cancellation requests. The default value is . + The token has had cancellation requested. + + + + A ThreadSafeSocketOptions is simply a convenient way to access the options of a particular thread-safe socket. + This class holds a reference to the socket, and its properties provide a concise way + to access that socket's option values -- instead of calling GetSocketOption/SetSocketOption. + + + + + The NetMQSocket that this SocketOptions is referencing. + + + + + Create a new SocketOptions that references the given NetMQSocket. + + the NetMQSocket for this SocketOptions to hold a reference to + + + + Assign the given integer value to the specified . + + a ZmqSocketOption that specifies what to set + an integer that is the value to set that option to + The socket has been stopped. + This object is already disposed. + + + + Assign the given TimeSpan to the specified . + + a ZmqSocketOption that specifies what to set + a TimeSpan that is the value to set that option to + The socket has been stopped. + + + + Get the integer-value of the specified . + + a ZmqSocketOption that specifies what to get + an integer that is the value of that option + The socket has been stopped. + This object is already disposed. + + + + Get the (generically-typed) value of the specified . + + a ZmqSocketOption that specifies what to get + an object of the given type, that is the value of that option + The socket has been stopped. + This object is already disposed. + + + + Get the value of the specified ZmqSocketOption. + + a ZmqSocketOption that specifies what to get + a TimeSpan that is the value of that option + The socket has been stopped. + + + + Get the 64-bit integer-value of the specified . + + a ZmqSocketOption that specifies what to get + a long that is the value of that option + The socket has been stopped. + + + + Assign the given Object value to the specified . + + a ZmqSocketOption that specifies what to set + an object that is the value to set that option to + The socket has been stopped. + This object is already disposed. + + + + Get or set the I/O-thread affinity. This is a 64-bit value used to specify which threads from the I/O thread-pool + associated with the socket's context shall handle newly-created connections. + 0 means no affinity, meaning that work shall be distributed fairly among all I/O threads. + For non-zero values, the lowest bit corresponds to thread 1, second lowest bit to thread 2, and so on. + + + + + Get or set the size of the transmit buffer for the specified socket. + + + + + Get or set the size of the receive buffer for the specified socket. + A value of zero means that the OS default is in effect. + + + + + Get or set the linger period for the specified socket, + which determines how long pending messages which have yet to be sent to a peer + shall linger in memory after a socket is closed. + + + If socket created with Context default is -1 if socket created without socket (using new keyword) default is zero. + If context is used this also affects the termination of context, otherwise this affects the exit of the process. + -1: Specifies an infinite linger period. Pending messages shall not be discarded after the socket is closed; + attempting to terminate the socket's context shall block until all pending messages have been sent to a peer. + 0: Specifies no linger period. Pending messages shall be discarded immediately when the socket is closed. + Positive values specify an upper bound for the linger period. Pending messages shall not be discarded after the socket is closed; + attempting to terminate the socket's context shall block until either all pending messages have been sent to a peer, + or the linger period expires, after which any pending messages shall be discarded. + + + + + Get or set the initial reconnection interval for the specified socket. + This is the period to wait between attempts to reconnect disconnected peers + when using connection-oriented transports. The default is 100 ms. + -1 means no reconnection. + + + With ZeroMQ, the reconnection interval may be randomized to prevent reconnection storms + in topologies with a large number of peers per socket. + + + + + Get or set the maximum reconnection interval for the specified socket. + This is the maximum period to shall wait between attempts + to reconnect. On each reconnect attempt, the previous interval shall be doubled + until this maximum period is reached. + The default value of zero means no exponential backoff is performed. + + + This is the maximum period NetMQ shall wait between attempts + to reconnect. On each reconnect attempt, the previous interval shall be doubled + until this maximum period is reached. + This allows for an exponential backoff strategy. + The default value of zero means no exponential backoff is performed + and reconnect interval calculations are only based on ReconnectIvl. + + + + + Get or set the maximum length of the queue of outstanding peer connections + for the specified socket. This only applies to connection-oriented transports. + Default is 100. + + + + + Get or set the upper limit to the size for inbound messages. + If a peer sends a message larger than this it is disconnected. + The default value is -1, which means no limit. + + + + + Get or set the high-water-mark for transmission. + This is a hard limit on the number of messages that are allowed to queue up + before mitigative action is taken. + The default is 1000. + + + + + Get or set the high-water-mark for reception. + This is a hard limit on the number of messages that are allowed to queue up + before mitigative action is taken. + The default is 1000. + + + + + The low-water mark for message transmission. + This is the number of messages that should be processed before transmission is + unblocked (in case it was blocked by reaching high-watermark). The default value is + calculated using relevant high-watermark (HWM): HWM > 2048 ? HWM - 1024 : (HWM + 1) / 2 + + + + + The low-water mark for message reception. + This is the number of messages that should be processed before reception is + unblocked (in case it was blocked by reaching high-watermark). The default value is + calculated using relevant high-watermark (HWM): HWM > 2048 ? HWM - 1024 : (HWM + 1) / 2 + + + + + Get or set whether the underlying socket is for IPv4 only (not IPv6), + as opposed to one that allows connections with either IPv4 or IPv6. + + + + + Get the last endpoint bound for TCP and IPC transports. + The returned value will be a string in the form of a ZMQ DSN. + + + If the TCP host is ANY, indicated by a *, then the returned address + will be 0.0.0.0 (for IPv4). + + + + + Get or set the attach-on-connect value. + If set to true, this will delay the attachment of a pipe on connect until + the underlying connection has completed. This will cause the socket + to block if there are no other connections, but will prevent queues + from filling on pipes awaiting connection. + Default is false. + + + + + Disable socket time-wait + + + + + Defines whether the socket will act as server for CURVE security. + A value of true means the socket will act as CURVE server. + A value of false means the socket will not act as CURVE server, and its security role then depends on other option settings. + Setting this to false shall reset the socket security to NULL. + When you set this you must also set the server's secret key. A server socket does not need to know its own public key. + + + + + Sets the socket's long term curve key pair. + You must set this on both CURVE client and server sockets. + You can provide the key as 32 binary bytes. + To generate a certificate, use . + + + + + Sets the socket's long term server key. + You must set this on CURVE client sockets. + You can provide the key as 32 binary bytes. + This key must have been generated together with the server's secret key. + To generate a public/secret key pair, use . + + + + + Sets the socket's long term server certificate. + You must set this on CURVE client sockets. + You can provide the key as 32 binary bytes. + This key must have been generated together with the server's secret key. + To generate a certificate, use . + + + + + If remote peer receives a PING message and doesn't receive another + message within the ttl value, it should close the connection + (measured in tenths of a second) + + + + + Time in milliseconds between sending heartbeat PING messages. + + + + + Time in milliseconds to wait for a PING response before disconnecting + + + + + Set message to send to peer upon connecting + + + + + + + + + + + This enum-type is used to specify the basic type of message-queue socket + based upon the intended pattern, such as Pub,Sub, Req,Rep, Dealer,Router, Pull,Push, Xpub,Xsub. + + + + + No socket-type is specified + + + + + This denotes a Pair socket (usually paired with another Pair socket). + + + + + This denotes a Publisher socket (usually paired with a Subscriber socket). + + + + + This denotes a Subscriber socket (usually paired with a Publisher socket). + + + + + This denotes a Request socket (usually paired with a Response socket). + + + + + This denotes a Response socket (usually paired with a Request socket). + + + + + This denotes an Dealer socket. + + + + + This denotes an Router socket. + + + + + This denotes a Pull socket (usually paired with a PUsh socket). + + + + + This denotes a Push socket (usually paired with a Pull socket). + + + + + This denotes an XPublisher socket. + + + + + This denotes an XSubscriber socket. + + + + + This denotes a Stream socket - which is a parent-class to the other socket types. + + + + + This denotes an Server socket. + + + + + This denotes an Client socket. + + + + + This denotes an Radio socket. + + + + + This denotes an Dish socket. + + + + + This denotes an Gather socket. + + + + + This denotes an Scatter socket. + + + + + This denotes a Peer socket. + + + + diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NetMQ.xml.meta b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NetMQ.xml.meta new file mode 100644 index 00000000..ed88ceae --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.NetMQ.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1e78411d33edf9b42b6baf841ddcc3a9 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile.deps.json b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile.deps.json new file mode 100644 index 00000000..3859c551 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile.deps.json @@ -0,0 +1,72 @@ +{ + "runtimeTarget": { + "name": ".NETStandard,Version=v2.0/", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETStandard,Version=v2.0": {}, + ".NETStandard,Version=v2.0/": { + "Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile/4.1.0": { + "dependencies": { + "Meryel.UnityCodeAssist.Serilog": "3.0.1", + "NETStandard.Library": "2.0.3", + "Meryel.UnityCodeAssist.Serilog.Reference": "2.0.0.0" + }, + "runtime": { + "Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile.dll": {} + } + }, + "Microsoft.NETCore.Platforms/1.1.0": {}, + "NETStandard.Library/2.0.3": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "Meryel.UnityCodeAssist.Serilog/3.0.1": { + "runtime": { + "Meryel.UnityCodeAssist.Serilog.dll": {} + } + }, + "Meryel.UnityCodeAssist.Serilog.Reference/2.0.0.0": { + "runtime": { + "Meryel.UnityCodeAssist.Serilog.dll": { + "assemblyVersion": "2.0.0.0", + "fileVersion": "3.0.1.0" + } + } + } + } + }, + "libraries": { + "Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile/4.1.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Microsoft.NETCore.Platforms/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", + "path": "microsoft.netcore.platforms/1.1.0", + "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" + }, + "NETStandard.Library/2.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "path": "netstandard.library/2.0.3", + "hashPath": "netstandard.library.2.0.3.nupkg.sha512" + }, + "Meryel.UnityCodeAssist.Serilog/3.0.1": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Meryel.UnityCodeAssist.Serilog.Reference/2.0.0.0": { + "type": "reference", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile.deps.json.meta b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile.deps.json.meta new file mode 100644 index 00000000..9ae491ae --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile.deps.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: fc47a694073149f4680bef9d0af5dcbb +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile.dll b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile.dll new file mode 100644 index 0000000000000000000000000000000000000000..ca33987de4bfd13e4468d8d8dfd33ef101ebbc18 GIT binary patch literal 31744 zcmeHwdwf*Ywf{P2&YXE>GLJ9=5@dJ;$Gn;V%0ol~1c?Sg5*3shCdmW_CNp7Xf`$;9 z6!rRSrM0wLwfJha)mHnl58K-oZq-|F<=1K-w_4@Owc7e?`@8mM{j}bD#ou?WeddvX z(4U{%{&VlZS!b`c*Is+=wbx$zan4NETz)Irh{(Y8-g`vf#GOCO1fCp>BHK6pTRwW+ zb$G@%wf4g^I=3cs(SdAcOE%sg?TM$;nS8W65zP*!qser1<=T#Df2KFlSW)4gZHZpj zO4P2|=%cS6`*oqVS7>I`qcss_L2)YT=WoS5it7L_BEO_{r8g5;fBC!u2s(dkwE0?Q z<^QF-g)#}BPRL!$i33Dcc1}$A93=9B6#F=MCuE%zjTTiGHYf1aWd$1ZiL3L#A07Ze zp0w4{8<>2eM4KD4xoi(G(d_^dCN3^m_F0DRYRo2588EW0bPyNI+J&p^vy5nY87j%^ z(SH80ZaUd%_cG{o5s}8k5AZo%k4+_V*IudadgPWC2&)O(?i_(gqjs@Hw@pN$Z+R|! z(x^rKp{5|s!5xJIy3Mfr44>U+`W!x|&lL^_>DVN2PBp8lB9U;+4fCK-s3}0~U&og@ zu7rn6a2+$Pwoa_W=k|GgUSGvT`O%Z|3%4aZK$n3R%?s!ao-A}4$W_BayKKN}ikKbP zhf0{w$V~&2TQ_ZG4K66-^Z6=$eqSIaRfvr)FX(ez9czkGjd3;V$IR1FMQ%Dk(Xe5$ ztk>s~swz}PF^nIxc6q@xRaG$`6Ba81(8_|{9kk-VqOF!d?w75QhaNtG?M~9JXj!}1 zMKG?Xnm!{O2?w=flQ4p&I(&Bcg08&B=`-1Tq?J>fDrh5ns#RyaXg%()_p7tgh|NHq z^|e036W-IjrHw%*&136nc_u8{l+Ljhkd!jvOtgzVXGLb4ICSH&#AcPL$ZlILB2hg{TUzwn z7&k@YgPm;XW4J{?&oR@;B*;?yc zbFzl5FvLfKEY>~};+xMtQiZ!M)(Bp=8N+CIH&mLjCcZn&STpW(bX)c0NNg^WH6ddp z0RDjC(RZ@|rAS2Ahnbv%P0X5*eI(30c8?ErJLZIQ^H9`p_{{p#e5S)^WKg9kT18o_ z`N-Yn(UFlm3&|050;25HCL2AB-oU^JaP#jdHb5U{!??p96OMc~N|dY8rVn%FH4PPW zf`%Go0i(_xL+6;e1z`4C+zXK|vt9U@Ry3bI9I_vouMe}KZ2BT;XYqm8CH zea11ZHd1RAJvh{4r`N#m5`OmA@lL86BbY1<-QX@VM-bIZUUnY1>&@6Q+%O1ZEx3xkoT@8~U_cR>2B2;q1fkf_rNs`Y^M^R)XQ)n#tKmg*rta=2|kX zpnBjMD1zM6vd>EHRDGC5S!JrTRR$!*&IeBp%MAAj`pAGAv)t@t~GON4E3R_c-1Mc}ar^)-&{>EHyq7SxKMEjtsalC_QnvW_0RQctzOQKo(DVq{-j zy9b^uHkKw@`Rlp3%D;U2vD_tSK#e{Ec}9(G1ZFX6&(?>z8*MR+9kYaC^dM+)`yWL6 zG2;hvac;c|SEfFKMxqO4kk>+6wYnIIf@<0Zy%-`RXrf^bGpwJgo5##4f>qg45FPI7{;(c2!*_+4XEPb zNbGWCM&_Be3~Xf{nc~hqIj(+F%}z&%#X&3nOrA_rW&sT$&b@0eYVf=MmXlxfLYBKOz*1qWE<`1BQ;;xe9j!qV2(gL z4Brv3@N|JPm@bSF7*VDTI6Lmdr9FSZ1A5cSaju*ZJm1Q4WYE#bIc8?KsvhLVAh&K0qD8qPeVhwzpa|#0 z4DiHYhPsd$FdMu%v4K`byw@~Lc@C3Z45Vb)>1$`Ne7OTVGS5&Z4xB`^{ zUu-*sA6YafTVc{bpc1IJUOLag(fm% zIOMll9`GO2Ez5K*w!Qb>djWINjj%z$%t#Lv&2}{?i=m3;9~tmk%%A9%@^K0` zDIcd>I9H8R&MA#kSt*xBsa=iHs&Hu1!Uv1P!WO6shE-=4n;!nln|=b;2~BTSO^;=J z9cX$uFln5l2djcrtH3M}w5B)|a3RfRi0uHV4fDRs zPJAGQb_a4ODDxQRTtnZ@Q@;wQTCHh|Wl>@TGom$P$V{g6%FIGJHE&@-SMG*ek&)Ys zf;FR@BlA|oTHKq%EbQKxspc}sFqCue!D_Hv2<8Pdmlq+N6LavqgjHZU51MM`28D-n zVov74TCkjFJM&--0%bTS<^m4}5-efnt_GQp?&_>&W7>7|$yQy=3y>KG>aAOVwbX8; zDy(MDL`j#dr+KE0jUekt2xkbk+k?D@gGYQg?g_)xQ)PYmQY{>+8l6o` zG*_z@f(bO8rfVyEG#^vP@B2OkoyV<`5F?BR{m2w+X%ZP}0%81$2Lk<=>#%E^VeR|= zNiCV`r>VQO;DmTBTG3c$9AQIxA!?v^<;lr^ge6%TT?u%9a+eN5P-%X$6>-?70i*<6w2d zxf{{^k#o6d?j}wy;G{mxxAIdrb)vQiRD>3cTaz3Z50lW&iF+W3DH2Gm>5_eGAgb3YSu^d5%6Ty6MB*=ISX^avx(Qh2|22WM2|7Q(&&$rD%9GqxwLXgH`*s4NA;hs|a^Wtvg&>!1oItDdJpl5&1MD zr{z9_+pfm!AZv*}aqqH7g`C`aC_1{FwJe;XpSB0F+^9V*b~}scD-M1%2_yCn5Jy%q z1J73+z!283hT>eDYQEcOn2~vII^xjz{Kv%PtLDZ4=^>ulc)ZxD4;~RNmV-^&P~7XN z_ca2sz&B>pk@CIi)0Qk8@AM$dyvT73sB!+Vd2buOuHW-l6e3Sdt-aR zr49%`4_vk}L5B+Ks7a){-36)6fU`_$lZBN@b(RhKlR=W{i-HZQx42yIzIF=S{jgNICV zNoN307pyFHWCs;{Vj6R^2XpNOM=GE)*R4R=NU;y6ADcH>A7;l87n$eL!>aGxb)m4F zf#T>!x>-&_kzNhn5$;zx{@w&tYa4SomN7>!|AHEziPbkU)|P9VBrnN=PG)R3c@`g$c8eZLVj+0yW% zP1d-9RaJ^Pm1bc)vMBVXqXiH5(?OJs zy@j3g8=D&EHO*^=gY!}-1^An3M6>qb-3xTiCKzy5M?RZOZ^<#oqgYc+c7t|F2mN4~ zdaq;F`IodII?ykG|Fi;m%Tt+d;QZ0iWtUCA*W*GN`gd&}2OIRE?Dn6kcDu!7H z!#=YbaJHk`>qhI}LPKw<*j(YJ3%yT=O!|E#^E7F1Aa}C+NxMm|3Qm8{e+ZgfG5Tqment{eqP06w92W-2wWq{H>q|-JJVqCBrL)zSLm)U5>}m>WlnmK*L|V z8D1;W=2f!H6gc0an*wal*F~!zN{x{U&i%h)tIvw&F9W*ix2`xO^td_q^Dfr2ZZfAg zi?p{4PFD%MJH+XS?F=t~WlVZZvBh3NojQ-E=_ucmu|&9$&;BIV`~b4Dbl`l(;a zMX<)>(Q}Sp<;{Sue!4{RqWrWLHM9yg3%f?v<$p`<^9chToS!qe+K1GzT~d~JAzdkXJl@-A4aLjy)*>QsIgSZ! zczY)$*i(XSq_kj&Z^*lX2Jm*$t-+uo!vI%k>zni-h`7>FD-X3#U?CUXWo;XMoRhyKNYyMs#s zgSJ+{`@^dNukc@pT5hhK4tN*f3_5Ev!|Ngp_Y17`uSGiOoe5}GG5tmx!)rX9fSvx0 zrbgAaDM+vKUkO-V*WFd!pj_rk0;+o5Qv3EQ*5RdKKj2zBr`?qda{^g6jq1Ru(KX>6 zfZs57A@^-J>%2f}zu2||>95*YzSqA8aI2fOQmro6K}q{g_$shDy&0zKXbvdD<`lsC@XdffhUGO{7QEFo=^TL%2CoDqr+r3B9Y86Yc0Y0- z3_b)n-*`mmkAbey*8uO;z6&^8XE;wNzoci8{;u{5z~5{Cic*`=Mwak9z$KM$0`Ae? zE>bG&)6I2JxC~u4d4GUM?}j4w9&{NfVunMbj}$S^`&bdPquc?(_R|}N8=OBaVsjiG zg2Uj$c`c4AnqS1WIA+r3B6hRmL-b@3`-Y>1YG)S89d)dybBfp>92=;;h>`QdbY~H( zawf8_v7wS9PUw zU!tq)85^T$rRjQ@9=EVB8$Q>U$vaQw?ek7@eT8;g*smjgdXy%grKE6uk5NjnG5VCj z*a0h#?fDq}PO$w{RaNbJj8=2thDTl)p6U83ZN||6V_9I2)1rlpv7XJYuhXRpb2i%Z z+7oo8h4tB&yPlvv3;SVZJFtObxlUjkWUZ)t;yZKz#|i~2eU~1#FxL8e^hXP0J-N73Lgr|3N=Uy966^-sJ8!4$@x1o}@;zT02B{2=+AHWnOOl13h733vl%L z6g{ml=WBWl*fSPp_b~Qz3)^op_JW0_QQuSax`j3S7<=EX3)=VMqj9H#k#9d+F}X~=b$mMBbHT*Y}StUN8e2w1z7 z_ojc3>wnQ_Ei4&WOFyFf1XEi7n7$&I()!2r4Z-%3SG(TzV|t=2?>RbTv?+9!XDN>;ra>v*}@w2Pq=@+Rqzx?Z5Kl;yoh-?Z{h(;jubNNbjH z4XWHP=@P;A(lTAM{StJI{sH?Josw>T19mP}e+FG<@-F1vN?z~s%Y_cAL#~rTHr|nV z0Nr%VQ!4u+wkkG}fH!F%!7in+>P0DslyXWb*SJz2q(%=tk9xh7!p69QJ_qQd4XzKW ziCd(3M4DHmRg9CCbo>2m6ThEr;`g&n{C>8H-_JJj``IRbKikCbXPfx_tfAk}8v6aL zq2JFM`u&ykGD=}pYWMpCxLV%N=G;>gHDOOsy;+|7el}5hvJOt@aJ;lqyO!&H(yU zr-B7a^|J4c_o7~GhRZ$BBmL!-eyosw^hrOyzqNPc*hr&q!Ao^1tBK$0^sM+W+uRV{ z?Bcf*b6Gd`HEj4-O{i;{b4)PbAUFq>v#>7J(*r^pBKa$5gEDP5I76=*QpC_vC-XP zPnF9Qon|6NX{0E}a}L9*$A2`sP3KYyJ}$bwCG{$JJf%EWrBAPPQ$3>H4Y-?tu__6O~*dnk^;Kc$r3XBU(3fuvxp|1UbNp!nV9s-<7i!`Q>0nVU{HC~tO z(|B(6QZzgt>5Z5@_i0hgnpJdtpp_oeuE#9-gp?W*nE{=3cn9gN^aOpxlfgG#_6Kgn zj+oQ+q`6{%->#ZZQ^5I;*qbw@S|~I0kJ%4{zrpw!cF|0qPk(aGrzM~;WI6k!7B1_j zGxcfq|Db05k2ca4>2HP@1}59JHa%G3)so<;)^-Tz5a0}LOuyZKj#du|%K=&P8x*Np zt!>nJeKe+jy=pzu-0CnM_Gl}mEi0vsx9h*L->EfYmcCc37EP)}6E1r%P^P*51L;2-+{Rafnyp#8ENI$RN-Lhze;0~Tv-Y-^^fPr0HaVo9S#gf7S0tw_ z`Jayr*z%IzZBf#d584jtUk-oUb`3o0r?#8L)7tdw%-4`+-)q+Xp>hBgd*1d()VM$J z?|?7E+RfS{5r$t1F#NTX;oi_x18om7{8PvT=cfSUC{=H~1E|qE+7$o!MvJtI>Fr2! zkGE*NVr~&nXwi6W+oJI*wna)YPqo&f@mje><8|;Gu(k%>UdL|o5Bk^ie&aS75qFCI zJG7wtfN_uZ5NvY0c6I0r#yk2e-bX;WAo#eU*=`FDXqxR6@3#z>?N3g&=OeB|#y)devb-pX;c>~bv5F7;_m=wk;mOgbyNj7k2V3GL!Sa%LH7b)NM8Z$5c(AYd+1g73fc}i zD-h|Qx3`M?9-;IIrH68~+M5viUZL+5`d-j8-fM+^pV03U`hB49_Z}484&r?lj|aO$ zTI=~f&7=*0tpE2V_Z15=&nv=18n=ivrjW*^>>Be&g&q}pROmHAUncYw8cSXwlvaV8 zg`SY~sH8`w?5LEzR_F(Wen994g#Lig4+{Md(i=Qa3FQ@`9Mx`uZm&vRuL}J&fuys} zHl1~_>8veYQlRg6?UJ4)^jVUw5x7G5TP58ixjm9j2pkp4UJJ6cy^yxN;#$eQPw4ka z`T>Clk$a`*5Yh|0-`BYxUlnMxae9`(6#{z%j@nqyy^_99;6b6hBJikCHXB^_pz%pM z;yG%t5BuzMTd)~gx!Tg&AjtacS z!P4#*IKwHq0!IZt>Ezs_&eP~zujXPn!^PHUk#t9Hct79*?;%M)De0q<*6<$D zJLU|5Edt{L#{?d5|Abp1>4TC!Bxw!L9N~2y&YdCYWs+`@^kzxNB|R$XF-aegG})UVvrN(}CEY9V8i5Cdeo){m0;z&aMFq~Tkg}3qDe29U?v?a46{pd6D-Hc&xU!Pd*I+0`lP^L3A_a7`nTdV>kX>a zF4Hz?TeNGnuV}y2-q8N6x%CQLjqQKi9L7vzsj;4Z*2OgW?*ZTPG3>N6+-5%r_@l~y0{po9dB8XHp98u)4DT=*{#@wGeVqGd)r){V zlm5k}W5sFXwKR4MI^vuIa52`RIwBmF8CaQB0Iq;88m$zKR-=TD=MN#k3!s~h_!j|e z$EsDs(~K!dZ$#YG=?Xl>;1%*h%w@X)BY3KL2H=aJ@w6pEU&nif5q$r@ z8Sq<(u=O|x`7ol~eOMR2Lbqw%`i=Tm^-kLs+dkU?+hN-g+b4|M4P%sd0XTRle)yRX zmiNVv+x{ELE~mkAXgj~{;Y4kfm|^iW3D;?8*Hm29xTfLy4qc{ypRU!Pp-1$?^rHSF z+kpa zGB=Ql53NYWb2-H)CFXL8mVtrP(E3C^k2;Y@vS&z2OYU){Pe`4|f>`8yPIM&l zorzq2WjvqgO!g-(%3Q_rB&)HfC!fhOdKPmw7BDV;yq?Wg%jR|=brL--zIn`66e(D_ zIhtwJV7g~>GhH;8O2xZV2_)NE(}VqqYyn%F?M-A8z2k`%2E9?BJ(3AwNgbLF6d2_91G<6|Wt`WMTkT;i8Cu!nb zrF@Bf-bvY!TV4@R%SEu~DbIigpuAtb^Hrtb=t!gzJ^3~9e9zWIZfS2WWN?i^IKgjprxQiEOfmwj}ahD+aS!xZRp~ zI=&^*+qpHHi1)VjqGYP8E16E_lkrrMDE#sCda$rj6Is}Md!m=tio0{0fOO@y#?gP& z)jinP$3011eW}6R*7b=UgGoV?IUWm{9I}@1I7!F*6HB*ubuEwgY{xqmtCEQnatf|{ ze9nr@AS&-|Po%fxw;rFp61A{T4|OEs*`BTI;(2JAKAx`w3MJA#iHipNyA#>t^0~1W zCeyuCP(+Y)BA?60)4lO5Ops$QUYosaYcikc7>M^ID2-p&D99yl8~P?eD>D59uu1FH zJzL}HEeY6eXJ&hX#4POg6Z?6 z(n813Wn1B>bc*(`$bg46K=;M7$#^=yVlb75t!YJkK<=E0@WpYbZA%*LE8@9CVE~r( zYoq1=v@V_n12=?LCi>zKw{|c;Fo@9IkGTTW%y_i5HwnjHp3Pj9WB=&LGtZKx&0Sq^ zN)eL6Bm)2HVjV?m@7$!ufl96TKx0dn*i{l_&wJWm!e0 zOLB-7MGVS!4{q7QDwSx32w$R1(7u!bM@#f~r-nL{`Em(u7`Jh>SDLvd-m?`QSt_)) zJD1_smMER^EP7xSegi0RRVKT=l%dp1WLGEA(sYU5dNuqwhmcqz6;xs0yOdr1M47N} zCfg4?X3*2`%T*YQ!dI$60w>DlE=}f=uvllNl(#<7*AeeaZmeIgaV zT2f{C1+CX*F%|UWO9cy^0A2Wpe@YpJ5)zuyL!}HW`tZ-3`)7|;cJp_REJ>CUQNAG)B%Ax}J%kNCTarX78Ghv>`bIOu1aF=rc_ya70-+uJFVb{$!aT=g-^key$TbJq`L-~ zgS$aZf07(GAyN*R<0)2bVV{Nt67l}!GBsNgx;VU^fQ}_(SsiQOL0gHVYjy>eRo$4Y zG1U*HdwBMt6}%Eqy2R5RiNtn__xAFHL2XhirzGU|7ST3oJI9P7$(p5#IOdupdcQ|F zJ2Qxy+eIdOwGs}qweG}RBv@CDt0`kfA7rr_Nl|8?>wL5u@uU+o@Y-zajzLhzPi0o+ zGCbk7G%#+Wo0!|j9arQPOet8TVfBRiSd!(DJft#dUTa})O%Y~2_+Ss>Yi9;SD%n5S zFJ8hfBW+UHDg2TfK5`kR;&0sFiN~_sUdR&C)#KDPn8tcLHB_RkN%ZsL zNfp7w!VV){i+J2`HHLUW&Sq^-UDur`~-5TJ~@VRey7v&R>M zZ~4;UvSfZM=Dbp#HGEGo*c!*hS{ZbSESu&;^p-))qQ_^l^PGr%Jk9FM^YM0XJeAxf zfw<7Yh~Cx`yRafCExPIaY-Vtv4Cf)dE|bFo8|L64TSVH{VxgEAkc_q6+pw0kmJ7Wl z`bC+1$Kb#~CJXl|QF-7XXBF1RWz?4J7VNLmc^)+-US7nclD$|7VvdClr5yCl>h*|s zB}zd;iNe|!mvrOS+0>PV*R4&rV!p<7)C2!OD5jQFa!cCUYp|M~8F5UWNvRLGB&_w6 zq$LQ*hDOk0WrB5VPY%FybBW@zuO-KhhgDGj0FP^g4T-;Eb$DUsLuxfpM6oHw;!DL?c5W-B_CweWp}D-s6+KXz<2sL2 zB*k{POPHmuJV#rs(Rsg99G{nA$BRxQ3{cQyp3W*1<5X69D37_`O15$oqBf>ja~RMy z=#}`EL}8gZKC_Eg3MF3EI1y6Xg%@1D#Z&aan~E znB^dX)PV<9Ay^Y;DMnY1R^lg;EZeR%{=?DeoB9m2*=MrC`l zFVQp9lS-`4WVS>8R=LTfnIo%v3iDhsR9i){-oXmN+J;(@#ad+-?Z^JsxIVFEFcn9X z;r$=4vy0hfP9^HBl~|a=MlmxG--21Z7>AU#WROcEdHm)G0W_PxT z(LJcr#dWRPIlv|--vP_CtVFb4jZLuBurfZB<9&BeJWpL1mek6*T=V3^m!q`j&p>9ci;>$j$M+hvSgwcH$jmT z)6t4Nt9dCe;n!v@7lYBWxqJytrV&@us6D+ina!kmE;*6b)~Qmt_Wvd0->yo8&y9x&{#nm3AtYshfhb45y)qd5OwlEUFyg|_G~P_V0Ip}GI(&5 zEccZdh&)d*j;+Fk(`HOwE%O~`a`E0?$#WLSym2gaClEAI;9nH)@)T=rqBx6Z3k>FOP4CFzloRzRW*>?~*WY0$(2M1Ai7Y#+j1E&n3jE7ymk}S_nVfh7G+XeJ9dU z+6gQLiJTrlnG7gNl)>p0o)$$#rQ{gP*O*nm6KSA|}#SS+%pR z2f>#wtDioy9JD_CW4p10D1PBAixOpEZ3EpC>Zj3L3JOOdJ}Ij8z)U?>Wm}<02Cj1=<$542D++TnQz#V$ z-yk}80A;e$C~l&18O~Ems)l1*EvgpGonv!)O7+o&mz1d=g|rN0Wgz?b#w+(O)ijJp zha-3x8O4LZW~68;8~AF-SS6Z`bKjv(F=%U*Bjqk!G7UV1f1A0r0cC?$bTYRok9QTXgsw5X(Y-{Za))LhcPU=c>E)jyIe!GQ zxpno@F2$Kc=^c>EGI{`)QWqYeHeq-yl1HKZP;`7b%{Ci#)$-enwl2I=-30C?Jo7CC z3Q8&qMj>x}$WVQ!`l1i*;9DuauMDMv^(L{#&5FtUqC z1URo?TJE5xaYj^n^}<>xl9=jaYIP6XI_bA5Qcu9qEeo+ICQG+ecKrahy;Eduw4%p^wd= zmW83)m)-rJnI~7TdMZ!0C}~Di)0}pIz$8xkB-tYHV!ZXI1xLRFHr+8PIQla!*ltAe zG7kvVOu)-|?XD^e6So|w*n*Evey$epwesAfgOPz zHZ!mT?|z|&0%Mn`zIp(PIsHzj9lWErILO9`)2hR5SZ*K7o|63fBgDL4y zU$q__@CDmh4QCO!oxWn)>BFz{`-1gCP;^Le`!)81r?k__=EnQ9q)+3vf%Fb^Kh3Y} zDp#|ZB;#~CT{GOs=bm~;54P)5{F=pBkY+LJh8xc2wfLlNC3Gx-DnaI&E#A{Lmm9)_ z$?Mlj`7pj4UJ7+#QFeeRJ3y3Oq$1)Fk3|x$@_XF4INuy*Ffa09f>FFGjJA*7GWkS$ zvI=fXLzHx|61W!{=NzYSLGO2Twt}5`odr&xpatvc!Q(1(2GA_j^oLU0OhJ7-99d2L zdWTY%UDD@LgA&Sc^T+zVQMjjkfP~brUB5Xi8KDm#&-DAaruh z6AW%(a1^8^ipPoM5U$xy70BTXX0V=_-eqtPunoA{9ai_t9sLj5W@dN|iDkH&aBYPQ z6;moy!W!qE0)`G2jX9h+iz$}1l4boKiIknqMC_b)j^NYmQ}NqI8-pMA1>*1|_78Wk z9}$a(!;aI)#d*O&>xSHS(tP-s|KT&&DZ0NVHqkoRBR5b$-mix z&VV0k?x@bwD9@z6s2yv8L1oAx-OpjAga&70WP=ye7~j4oD~CXJ1;U9naGicxq4<53 zQ8ksI|0QO4ffvJf!Q0vb=1svRsc6U=IB7R z4?p5&39Sav4?QFvA}w+x+R8NH;J6FP5(kS7Vwq?*sz3xC(-0P&DlAfI;lyhyUNs<= zA$qID6UKtfO2KwCz$p-OGSYBre5nQ1+hXLy7vn7L94h4m)r|{(VFMK)QSHN?uy5w;rgUyK`FGPiLaer^kg74tM|oZr~o z*i^Tmcj2OW@#dyQ@%ULy^O_bl&tH^S)I4ute8Jr2vwC~xFX{!csd+BZ85+$z+53o% zd<>1#!4(=Uy(n>26fX}YqB*=$km`+Ee-y4qJ+$kM;!zSm*@*JfuxQ45n=Fb~mGD|C zUT`JYP~r+9ydd!rjdsc3nakrH!YHf>;V7QP`&OB3^r~bkC4X`bFHh`D^hW#ef+i#< zq6357c$+)gvaXH)6kR;pH^{FFMo|kt^ExMrhuG20@~pNqGvVdR*qNJA2Jc$NdvS2E zL8Fcj&;yO7$IEpme1({s2VcQACButq!o$~vgGqZdcvIEis} zW1#T#j%^CM0KSJWdRw25?)u5Kq^()UW_%3S?vLZzQOM<)Ui~H<|4>ZBt#YJY%0vo_ zfpMSp9VNPDcya_RO0j@%tKi@I_?HG?7{{9nx)ZnvziUl}}R5_fhJ}Yt4Ae9eI3#WyA z!o`nA_%mBdbs{$oY7Ps2J{z>2&k4t)2LA38WT>Mab?kGzBz*53JnBfF;e4Fs!3K0a ze|uh@0rIwm>li|dcoT!E6(8PkWI^MtNF(vX7k(}^BqjJLy+yV$>iCwwv#O4g)HyWc ztPejZYNU0N$LDFhO;U&b1w9GhWn(=G_)6sGuzlfUsnQ1KZ>dic)G0_|5 z!w2{|OcTC=xB%KN#3QzOuv{}Ji*S$ASxC(jtQmg32)(ihx%0poM~S&epM`QglGkf- wHi3%ODLxCu7u87P2W9-smmjN6)MKJgO5y)b;8yH^HznumCAK_tM%K!iX literal 0 HcmV?d00001 diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile.dll.meta b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile.dll.meta new file mode 100644 index 00000000..a844f2fc --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.Sinks.PersistentFile.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 3a0ea7facf36be64397e0862d3d30cfe +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.deps.json b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.deps.json new file mode 100644 index 00000000..f8ab1f67 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.deps.json @@ -0,0 +1,86 @@ +{ + "runtimeTarget": { + "name": ".NETStandard,Version=v2.0/", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETStandard,Version=v2.0": {}, + ".NETStandard,Version=v2.0/": { + "Meryel.UnityCodeAssist.Serilog/3.0.1": { + "dependencies": { + "Microsoft.SourceLink.GitHub": "1.1.1", + "NETStandard.Library": "2.0.3", + "PolySharp": "1.12.1" + }, + "runtime": { + "Meryel.UnityCodeAssist.Serilog.dll": {} + } + }, + "Microsoft.Build.Tasks.Git/1.1.1": {}, + "Microsoft.NETCore.Platforms/1.1.0": {}, + "Microsoft.SourceLink.Common/1.1.1": {}, + "Microsoft.SourceLink.GitHub/1.1.1": { + "dependencies": { + "Microsoft.Build.Tasks.Git": "1.1.1", + "Microsoft.SourceLink.Common": "1.1.1" + } + }, + "NETStandard.Library/2.0.3": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "PolySharp/1.12.1": {} + } + }, + "libraries": { + "Meryel.UnityCodeAssist.Serilog/3.0.1": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Microsoft.Build.Tasks.Git/1.1.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-AT3HlgTjsqHnWpBHSNeR0KxbLZD7bztlZVj7I8vgeYG9SYqbeFGh0TM/KVtC6fg53nrWHl3VfZFvb5BiQFcY6Q==", + "path": "microsoft.build.tasks.git/1.1.1", + "hashPath": "microsoft.build.tasks.git.1.1.1.nupkg.sha512" + }, + "Microsoft.NETCore.Platforms/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", + "path": "microsoft.netcore.platforms/1.1.0", + "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" + }, + "Microsoft.SourceLink.Common/1.1.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-WMcGpWKrmJmzrNeuaEb23bEMnbtR/vLmvZtkAP5qWu7vQsY59GqfRJd65sFpBszbd2k/bQ8cs8eWawQKAabkVg==", + "path": "microsoft.sourcelink.common/1.1.1", + "hashPath": "microsoft.sourcelink.common.1.1.1.nupkg.sha512" + }, + "Microsoft.SourceLink.GitHub/1.1.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-IaJGnOv/M7UQjRJks7B6p7pbPnOwisYGOIzqCz5ilGFTApZ3ktOR+6zJ12ZRPInulBmdAf1SrGdDG2MU8g6XTw==", + "path": "microsoft.sourcelink.github/1.1.1", + "hashPath": "microsoft.sourcelink.github.1.1.1.nupkg.sha512" + }, + "NETStandard.Library/2.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "path": "netstandard.library/2.0.3", + "hashPath": "netstandard.library.2.0.3.nupkg.sha512" + }, + "PolySharp/1.12.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-/X82eNRZCcu73yacdakg+OoLSK3FEZRMJZMmJRQN5btxzVp7JoUPub+lZuCfBZ4yvmvypOi7q+TInM07+dTvSw==", + "path": "polysharp/1.12.1", + "hashPath": "polysharp.1.12.1.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.deps.json.meta b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.deps.json.meta new file mode 100644 index 00000000..1704eef3 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.deps.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c8d4ffcedc0cd884e8023b4ea53c11a1 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.dll b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.dll new file mode 100644 index 0000000000000000000000000000000000000000..0892fa52e2e1a32142401123700485b06b748995 GIT binary patch literal 141824 zcmcG%cYs_~**|{f-aB{7mSlD}Gh4DP$u5_f*-f$=(t-4_p{A0A5E@$$uP^( zLNN)w1w@D-2#O+#3QF%qqavLMA_9W?T2WsKzt876_fAQIufIROfj#FuALc2&cTa2PH~T2-CI)=ALENYWUf*NgiJNzgiBu!QhQsC z>Zl5hQ>w#IDyp$<`y$+d@C^7$4VN&2)SLeTUkw2%EDHHL>O!*e|B~;6MB(4_`xxqA z1|avlMIl7^|BfkGf49&U1)>eBAXug9$C+v-#3P-AxvoyBmbhW}PO!6M zonA7E6kA+(ED+h0g9-sW|_@*+ajsbE{tvG>6Y8& zTT6c4S78@M-;G@)-tO%(rNS`a(49 zBG|w#VX;fou67}_ou^xA7sj?la=BgZc<#Gqg&N?N@^9sdB(tu1lv3l3+7 zE|Po=t%Rg%>F)z85rN7oFyd1VL~>Y1I|k9nPB3q$&&1Hv+o%PG1RNx5XOlpq@78Dr z1daS@S%{%f+=*c!i31@Ok%49$L03ek9>}T0)iJ=cBS{mw7?)sdKVBKmDWEn;x~4*3 zx!brL7`#2iK9vGUa4`JF(|v|B8am}LeA($fXB0d`1G5AuqcV@CT7|UYQbxXgbXirK zbs;IH74b~e5Bhr7)R{#dQ}a}VM+d8;=3bT^ofvioksmv1ugJ}&UO|J}*)KJugkQLU zkHOMPvnfa*h!^l%g?gVq@EZbt2?YF~=a=MQ$dyXv`?}o+WV4X;$>NvLXg(54{1Up+ zM+ZJ?wa$bDjx6>jN9f*UYhffAO7R6m4fp-Z&gk><@_*q=;#+<7e1GS>qPzoxEf)i9rYz0dD&yZyuq-}?%AMk4 zAj_l=Dw9|nc4Neq#ris>1j^q(sk(lDJk`O^ql4rU{nbT5Np2ZK?jl(TOY z**{@Ovt!^avSWw^yF{(EoMD7Yw*0Q7nhH`)6;nkhNR`2zQ~jZ&N_L&9udz(B<{;JPVyXxQsWP~8s;@|@WY?(*yG~WJ>r^GYYpQQb zsx3jPEyYw33Q}co=TzU3RLQPW6?UDfX4k1oc-K^a%h+WV{QaHa4+!^4>(|`@<}sE+ z9h84Y4&7wDuoNAHA6zCubei$Pp%O&D880lCAiBSJVG=|a87~~p zU}FIznq{=d3#;gNeD>LA=M;`A1&?M>??)KM4tstGvoQ3e@!T>@gq(c<8pQ8M{DH(z zA$}G>cAj5AZ0Wlta1c2MiW2tZ)bJkS77%w3Vk5ji!{~GwK7e8LxAEM3@vjnE< zykO8>?Z={}P4_rLAkw6!dpw|SiA2*&fYz4)3m|>7;XM@01G){<_&^tz@A^$cTNB6kUL6t~R+)=ic%*acTig=Hp8wSn3FB2w-eBE?ChRg)TdhyOs7c zz3pUb0aLe;C);2)uu=wr9rhJ8$6DmDYlswQBv=PAZ`0P+JXezERN*0Iu(y(YRf$ZB z(@K*@oI}x@R7X79P;2WCON>VY&Muc6VfOY^BVrOKOoKYPstm zqduCMl!&^gGZ?FjIcFf?VefmbgWSd4vxtwI?o0}ggT5Y!q&uC7AR2NP?|EcwGif9YhtwzKV%()LD+$^;N!#RqlXR5j!L0R=K96A}JLr9uufoU01DD+)$}v4e(U0 zu2$Ov77}~ZBx>D-OfJ*zbNJc}D>4jo4=K;hHI=!sz59_;E)Us-Nl+_-D!(<*RCEO5 zt3;q~$DMW-_xQ?;T}vuzEvf`5P6v3LPB`q4xf_w`38f>>;V_ajn&?Qv9_*`>aUEr# zUPA^c++E7J=K`)DKKUYr`Z?S^k5D2JNhI9!5p)*Q=yi$2V1K2k>nZ925k-pA1yO?& zDtT@o&xOK63U@a$-0a9C>IP9mEI$o*16WKK3dEz%N>-8KQYEIIf>{CVI2;4Oa9u0V zoK(m`LsYM;Ic*_yNemZ4?#DrRi?L;bDfm9agGJXm7eg-NwP1hd-|#VAO5|>XYH{0p z1q`}WCPP63g>XA{X3GmoiQt+!&%GGw+V=`~quZOm(hE89-F%^opP^ciiVwT@pm0OC#=@;2xV(mqj$N4n-Fdmy|+5ofL%{EE;YA#fpWUD zjvAIUTkOUCtQB{+_1!C?l5UROXb{%kqX&{@? zJU#b%Aau|<3?ge{4bBZfWt+U;LANrdh6V>+kexXu#DeJ?#&>_8qi681p)UKINi|mR`^rr zvc}fdg?1$87cI^_YnwNy$6gL>ZmPY3$HXd;yGLwb7WPJRwpGC7R%+t6sLDx@DnlZ4 zyO)TqMD$Xlv2e6KO@-VjOvMtp+d=NyHYq3t_iKRNJK)5P!HJSjOl&d;?67a7IM(#8 zAyP^`WmRTMM7r{7)FO6=&Yf^Dt=vBnOe=jt?&~1b*fHlW_>xRScjgaok4Lh0L{~YR z8?+g}-px~Uzr-z4*1NE}2=fZe7!&RBpsv+LrLK8x;x~Ge#c%Q!h~F#&*Ve8U86CEE zjr0x|e5x~5 z8=7wgl8J1)v;sMVLD0(G1L>v2;$60H^qXjORPea_ZE{=|M6K$I_#9uZQvJe^Etj!$x&3W-s(cPqKp5Q3Z5bM$2`jjtJe*sFv(5i9svjEdRSyxcAl<# zFO<&i;{)Ge4)$S(dB!Q9sBD}zKT6fU zN15YMaR%ogWtnBpMqr2iLsIVtwQGnJr;m-HA5K*y8;uz5_d!bg$^HQ0p5Z?5LjY5b zM~yS2LQlm|sdA4&TD4JUM$g6y(Q;OyN11~5uVN|Z0r1y{6XEto_dx{Fb3D$Ze}u3z z0qJqzZEzj}n2jOiK8#RW*dNjCPmujlvhPLqNFvhUJf_(r4esM)FZQtypeCV@jpnHa zJK6~`BAR0CXb)hxtfMvDClEQQHAJV>;5-R<3hIhVSnUn&Q-B8NK~S059-uN$gU~fZ ziZc-^bu~E80Fxc*9fB0lqdg1Ay9HrA5FH9|eV6o}gYzrJ{fOe86LF+C=yEd7WM&g9 zHurfDf--mk;p{nn8N3J})qkoF{RB{b%y526mRKT|bhaUs#(wvS+=EQEXTR+Jj6Cr~ zeDewQRf!mVVXCiA*4Jd(6Y)gNmPAYjm-^a7b)q&=thN1Z7!kNX;=I5XfZOr_0+g;vADBz72Nt3$UxGy?hO*>QhzGDHn?uOm*^ zHaBQ*gSs{RnC0*WNbZ|L-)|@SLp#yicA`IAK_6lZ#OWq>q1@%5_`x)T^H3}&pz(Ai z&8_ZKV%iLM?||~ffHIyK?3=q|gTUkjV?%b~cJ5ym&ANdTCZum;aA}~TCSYpqr%~*bHDL$@WDotTq0nEcB3}oEQfi+DZ9>E6pcy@UWwPdE8->Wg%IBp@wx56^N`Ty6UGfQB$Tw>-$QDq z)@bjrbALckgjU8*^#{?@i`qNd58;tu#@U&!lHqZXEf9OU!dY)%TBoyXn~ZjmxgkXk9NriB!+sT z=DHjeWiMkSQSsy9qQ(_DIw;UM_isopTtwY2HS+X*B|Zgymke{$^J4JeJQRJgoP!eN z4!pp}nO-|HJR2GAHcjVZRHz&lvpC^s-;w(X%BagIEJFEc{ln_HkWwAc--sKj<-=7b zEFM}0yTh@y=&IOnI$vUg`Hhe6t@6?Bh293sSYq1N0(*tK1B|)bz?jB){PJ>aRU`$D z#^ss^{S$@vL?W6ScRA{;y0CL8(+H5UdOOJt8ez@0B1Zx->Y@e z9U~4$OG|{OT!5la*4H9#7`tC$rpqeg)*@~#=3D;Q@+xM&J?>{zx++nX93NygQ8l6$ zgNx2j#z=&*gQh|#d@E61vitg<(ju_M?$BbX6~mV$w$OM#PWEWbD+6a=H-h$cmJ% z7oVSCDt(^eY^H5-)GP&BYdBI)Hu8rXVyW~j!!eM}9w1f;;y9yyOfPahqd#soF2PJP zMJKrgm#x@0*ZJ+1Tw!trEtZl@Us8`q5`N6y)hMxNVMi#rgJasBev(ncu@C`eg9D#B z3>p-efxv2X0oBo}2qz}I`*bd3pc_l%!YmNK4OKh5pu3oVrq+LciaF*_!?K+IKY?so%Rw`wV8&v%G!LSx74!xw@j{~R~s%|P2chkE7GqMf^{mJO5s`p4yQaxCxYDI z7F-lwcDSAFt2XRh3_#&ZF!4H>%!F8%(pQ?^Nfe0bMW);G&SiKm!<>94lQQpO$46c0 zQwjQ1iawKt#Iq^ci6adnsaSeL8L}rVmBREdV} z!7wHBk!lvy4a8c7E%d^L8>t}d#50_Kgp}%L`rh5lz`UKy&GLQ>yq-*9qK0%abMxLH zZw(}Cg7>R3p7+7C5p~FLYr$Z7p9D11{QxA_z{qAf&mw5#sZe&b<#ks3X=onP{Rrd+ zH(F#hu@{aZWTfQ{lvs(9`G*##W4XhS>Xc2$p5?6$c(GeN;tR;I&oUe=HJL+VZUOJf4q;AEoh+1v;Osxb>s!q=%-=$uJ5@-#I_DUxJT9Mju`cW#fzvUW^w z6I$&BVfQo7MT#>YMjl)mOvRQUu)}_pQ!yM!VroZo@U`8#TfvPvj9%q z-kj~UybFWu8n(`;<=g`k1u7JMBhUJvXWe=a_s{C^gF@aa4O?(@IsxDXzEi}>+>256ib(BxcvyxKyM3A{cs1i$IEtx(=!i1 z?MH?l!yh(@)t~WKjX(Y){zUw3#UJfijvodb?4dBj)eAMizqYh3s0=y7$9uGR|7c zMY@c-snU>saq`rwn+D|CoL##2N0f?G;2>$gM>4^=2RWsj{X>hJ%B!a7 z*Yu>nCoocd@q%Daz);^qy~|MNo`~f<12xmKLJeV5ilWPYT4S29R+@rc31zN3n#-nP z=I!)Rtj+_P<0v0ZzdC9;4{G!oKAL__%yNFD(HJ2^*@SsJeeT{^&W|+#W04T(b2rCw z9@2y(eFA;1B`oJ*O~B$pV$kQtwBnX({$}8>AAgh;fvnzPnS)HPKB#w@qfM`=2rR)4M-iBBdR;|es_A8l zK#%E-F9IE=Hz@$j7$yZ_Z*RcPw7|Bq1+15_`?g|?j$|AC#cyvC*^rg5Dcq>(f#UJ)T8(2n%a|X-JEz>zg+F2I&X3$5)8+$R0WT2_H zZtyD@FbwAfFa&HVy$&3=0+&C8tG~`}kFUg$V`D(U$5W}Xwj3#9bt_mD%xNp;T2QD1 ze+m4J#UCdNnV!L0n27B>k5sBN;|6an2RpS20d-f6s-xIHGiB}E%ei$P1FPbMsC8sSW8#3H8{qejRL@No;P3oM(;rJo4lpsH+!qZ zZ}CnNf24O7eMBgp2VNqCl($LzM(--|o4gyvZ}#vZ79%vaR|QGlE0mP?J@Fg82gPsl z9v8padr|xr?=|s9dhd(h>U|=9n-{C4$~ZZ1)q%Lz&j8LKi@DlgC@Jq?@f*FR;x~Cm zh~MlTFMf-c6Mv+4E`1ze7ISrl5K`VX;x~FXir?gYRs3e}oAhzKUySfWA*8$?i{I!y zE`F2uy!g%DFX?X`V&&SU4Bio*l=q(ajowG%H+g>%zuEg#{1z`Z3^H()AVt5t4E7L0 z%FBq~=#3Y@$(tg6vp1W5MHw6{l$5tv{6=qu_)Xr?;x~IIiQnR#A^u43Lh)O@Ys7E! z?hqek@SqOFy`M2qUIsiTV$J$cI2ye_ir?gYB7U=nWeVsmUXA!8y%zfAWsng<${QQ3 ziQnRVMf{Q8H|dv`LC_90@teKN#BcF#6n~`mb^7IH5VV6I z3PYp!u=q{h)8aRKKhqI*Z3l1p5#IG9eB?*?n?x95hljiEvdv|Bp*oBLv$-ZQa#u>n zdlB5iSJ^9C1+1(5eR5k}i2f7Z=;!Wj7#e<89c9n0-B*?&=8hIMqS%cu@*D+iK@m3Y%jnO+s8#$NVIodF+ zW+ub_#b~)=G^ac{T}V5}-iAaoU(~xCe!6urIhvhvA!WwoOw+fHQ#{q=OdbalG`5r# zM|Mo&qlqd#Q%K^Np)z}N!U^^Yb7jX^iRfw5gIQcTIR}ZjDzZ09RMxr}Y4^S3)6YKR z*vkDj>`rk{Ad!0un>lgYD6GIv4(`XTgjZ{2m)Ba}B{T%?%f+(`OxzpV&Rw5<0Xmp} zWd@fAdqRgIu)}_n)ES_54Uytt*E7?QYl3mB2k%1h;E-I-Yr`Hsb=3QKQa5npSnqdu&hlSR zrVSUD!R>4s`xJ=7aAfB=Qa+ldy1LqejkN`JV z=;I9*=WX!d7y`%UjD?2<=sCDphlRP802~F$%>;1%Tyyr|2(n5CUDSqn$0l?^D|HN? z##ll-I<3zlO*I30@LzD2P`FR4{#|MwlAY~#gaupjBxOU!|6qa!$S?j!PstNzcYr81{Xidk#dT`2x1TTv>gx1LiMoSa^_vr zOuc2PwGEO$xO(ox3wkh$(;R&2W`A*JQ^!*Y`KOw2|tkt-Xn z$inAeTI++MYPaYb=02sGRFs`N1SIqVzm>A!Y|L;z7MG=C=UChDahS{?ciS)@f?3co zA7;_~PV)^5eV+0CwpWlyexuV-QMyF3v_(`}U&_VVbNX7tt7n13$S82L1s_I+LOCnKNwL<9W*D%ro7Czu9$vB6>DLh83BWGFI zCXwT({ZrU#vTLxHlu5-B))x0>D2XdIJWsDmSh!VznR5(n>DRc=Y}kb-s7*9m<6Q#L zrvFg`@Q)J@eR$r#H~gv8Yx4<>hvgQth%uaZ8j&sQI3(Xrr#dPh_Td^t)Wu1fo^&BX z-)pvugETomW+qT14o@EGQ*jm%vq4|dgfBWF&2qb2a&Hf38Q5iJ7}%OwjLH_>Z7M=_>z4DuSJcgaOgiZ10dMkXc$YXhA_XJ2Z&3vKb9Kt%$d4KHv1CWSe!M zBw00dM|xI#EN7K@x@FVD z9rnkZU1F{rcRHXSUkH)O;}>A0q36Xo4cgc9TFg)Qy;x$9G%CqI$rF|i<{0tQ{kF)gIr!7aKRk)5CaWOTH_a0Gp zCdzljjA~qJu8+nvIwtH}<-)Sv_o0nWwhhbF;D8nD&r#HclC}nYZ4`ar8&Rn{dUaHm z!oH_tznu3fZG}FMb3N$!2D5oA+dwit`DUQ?c`9br5L*?|#Q=RjVIhgqXKD^PJ>`CF zNogLc#w22e()~ID^rg)DF!F$ddzQLkB2bi^`zuftIe99o4_jqr8|0^Wbi40D$xjRV zL(I<9Ov%q5nV;3nPuZDkJTqv^nJe!f?*SzYK4Qgy&eBmnFBT;69O_iOx-4={W^_y< z*IQ96aJzMMs}$YE-b&nG>i)8PsT<9`iX7F4w>RnO?9?-Osi15|YvB`{bZ8`OsFtd+ z{+Xaf6ka4?4niNjUWBe#y#AR@7TZbjt|3yK;}LZb z3YPQyg*@1l0}m+<_6Rc032+KOg-m@1>@?_rX%^<4#IavqWJkV=nqlC{GQ;@;M7V1q zB0EVR(FC|NkrSL9m4o`ornkSwN-hb5@JGa5m=1P!`tC&c&AcqZ!wk&e!t|emNmSwI zfYCX>Ot01|{6c)Y@DlxS0f%xxM+&csA1?e7K8|AYgd294=`E(bTaXtic@dJAI3}Lk zBa?o5VS#2d<&_9$I(s_yKM{2qY%m8lF!fAxn70XqVd9%Aemsf?5kxQssddOu+_ZCV zN&Tz~=i)%%^$aF~olV)i(7P<{mdqnKkHdmf7;uFZADOvRAQCt4MN2%wK{fGs1vQVx zj7WvP>&*sd4a}V7qYNV4luebSgLh!rOP4lV9K5(|r;kK`KM#Ry4Qk}zHpq1562Bq9 z^W~qE|7@y${BRz~+D;&-(;9f|{J= zZqIuRM$#;+UTJ`qb0YecbT5Np=Ol(FN*H%Cuy)0Z zSw;hxmQ&z9B$Sn=AL*2eNT~RDmdh7W8+Kg6KBriIs*$QxB2`iX!J-ljS1NIgRsw_y zB_xusgdfRQLPI4bgwt1|u~Lb~k`f3Om0-A1iIcSwAXF$Jk$ffmNWKypDk&kHz7kE9 zN;H*}K(MF;!<9;$u9X0xLJ5iFE8$1-mC#U03E}jWXs%SExugVwMI{)nRANXg0YZfm z63JJ>kK`+%p^_59=_}DvsYFXj2?UEuFkGp`rCJFPDwL2&z7l>UUkMGBln_o)LeG&g z$x!n-ru4+{2|}%W&7&J0(#Dr@Y~lF2ZgX}Idk}L6J#1q(fua5HAmuz6wn=f;qUvWN zgFi!)tcu_>gAM*Th4}o2s21ZY8#Ls)ry(jh<{5boo%#tsoU+8RT7C_P^q_&(sM^V%ebCW&B9wq2Xm6` z@VGc6NMB&=I$-e)E@ulX4$!|M8R-`!fWf(6V|cDCC4 zH#_rO0hIOnoCxAotXYj_zm4s1YK2X!2}!864r&$NLAv;|VGa?e6Y*>6x5miRH{C%< z%3_{EHh(-=siB=8iG<;_@WQ(yvhW)ULQSM!_LwA|ydr}y>^~UlJ;s;utK3e+{=c?U z3-;5n$EWs}`ocMtZob3K0s9XH1GdfCD z)BaPvuTjm_-ZsdN2Aha^%FG%&nz!QyF84$EZ`?T5OnpoB zrKI48;D>_g6cjv*y8RA_^!??t4?RIK@}$UoZfpqCJVq?lAVNFWp#M-8K4K!0?|$fq zz5x9Xam;t8l#8Fg;Wg4=qIeR9llQU`c`eA_FcoW5!Isy$76C)u0y_k#lnHiraO_HkddcA(;b5B(^g>thb1%K z@G0kk%1j^aCxZ2v^qvyQJr{90J}_}~h~*5$xaR@mOSIkd0c?*)@t%wBI58>Id*_SQ zgp2$&w~>yQ{cq!NY}fzd$=x7#W&3}D=`N1K&3f2u)27EFBPfEEECT5R{{jo7@u_L) zGan;QobC^Ktf;#>-H+y3YJUZ}q96SmWq3xOzTc0cyvT;#0?xhD=tv3fTvKG*o$`y< zcq-0T)<8@DV9Pvp1&X=wccxUKEk5=l()}M)Q{0plZHwospMZiI{ttTL!ao`Lx$>-9 z-la6e*;3muw-Elku;1XoRy#@dV!+FC$Zr5Z{yFnQ%gw zaMD;U9QbtK*OvVeIw1b8PQZf?9fYYrl(yYEBvF;Y!&lC~5JG9NiUaxwpq>x)i&(UN za44<&k0#YJLBEI9JNOyw?p}bNCfz4t!@ZC|Z*Bv;AyU($Fr6O-fhZEG(>zkvEzy!^ zVG9cLW&W4~ea?rMlNo2C8g|cxb<4>sE6IluL>@WMJr6$r1qqZMY%GKz98LXAmND2e z1%rsN_di91Nd!*(8ydlKK3Ocmggw0EwbsG5NTv`LjP31L#Mpv~c&8UJ5n$4Trgs-H z7a|r;znK`G%7aaeJT3U>3LF50Y=jkBbcVW0Y!BWI zEkwbDYWOzdIhP=Jg%}VrXW18aST1E>>QkibJEZ&d{=q2HI~jRKin=#I%VNpDZsaK& zCw{?mKjkGqm5t<>A_=Wb`oXP^5YR9$g)VyEeIMw75h{_hE#BWV3s@-P&KKR%f&*VZ zH@85aFR_65{$d2oxh+u0a%SoV$@Yk5&TlCaxu`E|9i;3WHMUDsY0Hdz7~@v?aWV7R zC2sZZ;)d1N5%+M!HN1VOzq5enMV#;@Md*(m9f4Q0tcgR^a?u3mpZ;K8*HV3+*?b^$b95-47tuBx_t&S)KY&j+|Set>_M)QayIfrx(=e~ zpk8-iKEmIzL7foZtI3<&ip21l4mJ(&F=mVZJfzKK1TgThc8R-R1(W|R*b$;b8n-bpz3br>j~!4sb2Yivs%Ow}kOPnouRn;4V{@?KhT zxWlYN65<$x`K&_k4%_^^4GLW=wqc8RX240xv&lFka&Lzy+nonompcu~;`Yv;5uw3v zwyE4bK;qsWHYG(i&PS5S(BZTK^TWRL7)j@$U~SrMuEXvf4=6`Ob|(`vQVPYrCvI+P z)5sV+1G2sVS-IhU+rthQ`eC{i{qXbc$kBDo5Π8|2rJ4J+B;92w|!H)Nq-Lx1=_ zxvwX;>7_alzJX!O+mm6DB0n8a)*nKLcPC?iNI-F=8-+p8vrHwt5+Q^Plc3&;u-{nm1DA zTH8B^z)g~u~mj78tbh_fE?2`7)}A?pshh3N;boaSZ*}Z3m2N`HEnXGBOI&; zgrfK|1n15}Uh!EA_vYX?=FtDyTMJ3@*V>K#6pNdC!i5Dn`oNnJ(fJCTLWA&yom&Wu zAYdA~I+Rc$1t7hTiC5d5qftn59Y9(~%J~8d4SD8TY&QJWEH|70I>&+#-@aFs_b~Du z2}Y7Uv%ra)7pPp)!{rukx z|9Iwq-5gjcZcjmZ@>M+uKatVvuyr57(H6pT=K(wS_PS+Y#f5`oqwY6gdLz#oHEx-P zdg7=}^-z9cW{Jkg{TI1O*oIAFok4z-@lC`HyA7~K>1v1w?0dD=ipfovg_+?=2n!;fMj}%0IQ(=2cVd@Y4v3v++ajoPYi0$#u9W3`ds1|X18~RCo%S}$Jdrr2u zjjY71w6|fFU(U0i&8Kn8F%xaRqFas`WAg>xa!j4g=Xc96+5P#}=_6313OnG%yFg_+xQ$ zJidlMMM}N_MS-GpP6mX>NXkW^?i=z}4Q1&1fvvb0#z59@|9c}{QSQ>)c}AYy$M|Lw zza7Dl|6r7N8QP&VzO<>!#84+dH~gVYuo6d|%C0o>><=vGR&)*7aF|)q1(n@b7g1GY zn^R%7p1R03OkT?ki7R9G!CuKN&PmLk79$V3t(0EOaIs6m?%Dk=e4Ndnj_20)ghlb0 z#0^LupGjb)V|7^tERVQJO&eg&Ep{~YtHHw!_uHsHxYEkcY;diCU!JgkiTjVAwNLNu z(UYFW@uLFVvi=mFLVFLXw$JLXw*3!-$6$kozb1=x@Q!u}3E^LE09;+$27|2W-@xeF zcH+*6BX>q%@}jK~M8WE)5`i(l5^>bd2+V^jInLY}QP>%A_Ra__ASz{GYF>$$zcXU) z&WQbXMqm+9DFdTZIbw*zloV)67wGxAKrv#mK(Py>sU4cSNmDm!Dpu+keoz_uG!+wQ zEB%oE+Aw!7nnj@nm|%upXeD6e>E%vGO)HEf|9Q9)L^jj?4jU3rG>H!%V!3C4X(9J) z7=>FpM*+bt9Syr2^LPmuYdmz^g*J*~8(tta0-Huz%i7#C+LX_l@O+{EJgUaK3Qa4x zN&)~SfI6}^PcOIUF(caro` z{N@Xrezvv*n5%p-P1=_a;H$j*%0vbRVD{VPFXK>vzt;mQ2UOhx+MiXcOijXVp; z!eE?~lBao!w;X$vvD`d5-Rm7sip=tQb3+g@)WK>HY%StF z7pyNsyk8ce*r)9Yo1F}s8TnD*=0Z7zO%-9~X>%ql8=S?xly|Xzc_C$wE|-0e>E4Ha zZ*UBdvg<|a4*MeJL+^T#;@pP3q&-vjnz%dmL)a#ZHQ09%mp7!6X*@O5=zb4iQO5_& zZRibk^G@=iBK#}@Y=)T0E$;UL8uFVuGE_r=S8O>BQp7xVPkP}(8XjckiKS08eZlwU zE@zf98mD(+Panj}(832E=mxQYw-zbs5BP3pCPw)L32>#De!$1bZ^Y;uhD|<7PPj_H z9kauLo<;Tz_!X7iu@f&pH6!e7tNJebDJZMK)1ey72c7gY-FR%Z>_u<)0T9Z`msF6; zDc9{pc@Q!A+#j=)`x1-qN5G`JX2(?BTON=fGA|3+pd)2=cP!l}YzNCZofrS`{qhf!Q%j79l!c4OpG43@qZI$k$L{X-;19_57gpX}yO z(S4hVJ_G))c!7A^xq~f-lX1>*CP3y|>V2QDH_8-x({-Oite!?AkL5Jg|87zJJ1HS0 z<6)+#6Z--qkKKx5(%&gdnt0p!IwMNDSl{uRjzsQze!8>3P)zFn%A|shvS=hxZ&xD~ z=@eFG#NONwAaDrPwA2r?>%cY?u1$+R{m{n~+cF<~%&*%XoQnu$KXmY5F+W43XhTZF zprzO_bj2`pFB0xEou9zp$cYn8X=jUWhrWfqOf)U{<=5hhz6jPa}D+Yf?B_kD?TD~M{nGVKj+|)LgTN-(?#BF&~$AE#^;9+F>-~p5L z5d{&EUkEPgoO@c0!7I?G77nK9l#o*aA0i|Ri%H1S#f1V5Ft%|v!_F0Gp14%RaAbVS zh-x{Fm2%4CNvi#FU04g-MdT$AiSu>h$EJ*!me}-vNSv_(pBC`P7xK(Vx;gg>jD&mo z8bp0FWG#4F(MIh%`q9p4MX@JtOC+^z;+aTNo}Z4RYghz&f!URV%9l`VC_Vhpls&YB z$poz=ZOX$6GQ-f*8nC@VwnNL=7NG)S2P6(J1y67A1TwyZpP2-+&!S%hh6)Pn7GCZ583_3|`{h!0>9;CSwLgN@@oR(>^eS{KW=*%% zF{nc8q^)YcBf#hXC;+ag=Z^$v^NByUlR!82b?iSeWTXGo@m>duACF(M+3SwN>=%0^ zqoeY%8#V$l(zIk7Vz<*rg?j@LBJP`7a&PVf+Vp6oR!oJRN;k<2?7={g{xSHePjH&< zTfpkDyPXVtnS3=Um?IshMdb-1VqW0h+@F}t@fxQmMU?(4MrIi@0Pk&hx!;2oh5a|i zII%oNo0Ch<{G2>Wq%83z1OyX@F71i>6sg~=2 z)1ML)rLkUC$UC!4UQL-i;(d7-thBr{fGhhxArLyt$e#s@zT?A&77&=D^`PXwjMWu? zGTmRJo(&voQ2`!!hw}8HS6JTKw~^05qWFwKl56UoM7NPAGd>8w%h}w!wRNQbIu192 z{W$BP6cy;N_kMwqBRG%H`?C${(x@>ACV$izLXblO??rMBNF9wl8RB;Pr@c_CKd!b% z@Kq%A#jRR>#*@JBil_+K5ihJpV5~t`;>SZ9Js;7l`4bVTX^(;@8Gq}q@G#a$!pXu0 zrf=lWg~z9q@e=|>w0|n}$=8xMPn6q^x_A4b7|hV6FcP+dv9u10fJ8Vd8>r(gd{0=Y zv!Z$j*mO{$Xx$euKKBJrI||~8#1ATo&WC{gZ`h>6$+lpPTR4aMq(q%meEZZuHD4=i zfySq<#PFi6lEIsjw9fWAG-axtjMHF^G?hJX4>{aXX0P8H=hw z2jTM=W}zT_A;YwxwAVIpm(`z(f%ogrr3mg?f5@;?{TWSj?5_S;>P6^{O*!bzc&I;{ z;GzEDrx$w9LFM@t=&+5Xnk-xnA}Y_9;JKYBi2`OEQh7+v9BSkVOU*&0Av3?ZXQ48j zKs9NCFO_D7UoG%6znd9{wWWZ`28*7;Q1p{n^pda^%cAeO$#9q(mOFhZcP6UKy^|T0 za%Wp%xj*rQF7BPmx+HctWlc4LvPRJh7?d%#7JXakGG-Z+%2>oo8FN#QWlVDx=pek2 zVcHJi%NSxWqj(Dk;;KIEoljgMtWS)ir4zAtfX7$2ze7);AIggJ&H1w9F^KH!_9k_eM3%+A z4`?u8hfh|7x}!;0jZ&LrLRYwox~D{SRH<=6HvAk&Z_+Eh3GIhIgc;LyDNTdwKIB+r z0{@oc57mn2ef(`j-kX8hN_h0cY6kwWiCBUE0dSr8I}G@sFUo?0e?ecgCa}JkHj6?M z6JuE51R&3BlvPOqi~SBZ=KZqOb&_?aR41iOrB3o(fpwC_FQ*F#U(YZL5aDYXX4y-f z#DHF2CvODauajR!kgFZeDPKjt&XM%V!1EY8HI1W)tZyVz4zta8;TFa>@;Ae4Um`#I zSGbj^WMM13Oy0-~m?yLaXV@PjQWiZ5<3*%+-QNS%Ge-knrW@-sSsKP7?jJze+=C}| z%DDdsT(=P^+{9E;1*#%zDbWe<#t~jFiEBVBfTz+t)`tesPS!9KP-c4p#rBhs&7or6 zwe4w}lIs62Y{Y2FEIj>j?+I_w!zle>Xix>)_-;E>eO(esxM%mM8gz#I1l zZPv-|F=WO+EJZ_yw%=bBYXk7FP(KfoSYdIXp`OGaOrxftqW%CAlKlb0l8Qw-AC+|o zK6&}K7ydAIsxRRWCt(UF>P1=~!l!}>Yi!PI@NbXtj6>+pqn6IJ)w^TpuIi?{wd2$o z^=fD)sq4Bf91ot+#GlvsX4+Qsy04#Lt8+)weMsD}xTD0K(?$HhJLpbtr~8$5#(ix8 z<$Tt5>I_>w1NpYPa}?cNH}O3KbdT+zd)!F6UyIPaUbMPB&hU+$e7h}9~xzNy13O<4Bsr$<_RV;i5h;kl&&dMoF9PaY5X*{ zt-ccnJ>3hycUQ%=??N7|fW9gpOLic6K-GoMl51KBn zX#1kb{F~@};RND87EG>@lD|5am~z!w-oaZe7H%eJI_k8FXtTFQ5lA`wC0g>gxIrf(prQkOZdFm3?Fy^d0rOXGSv*H#Vv@2 zwKc@lh&xj>Ia%DFhz;M$l6tJJAv37?b&{jb8N}x$eAfh8V}#i4KCx$=$iGfpC6W&j zcfGh))zhelw-38;JloZiHFTvP!Q^LNoZs~Y(BT4^9Bn}J1PUue0CcfH5sqkpPHul? z?g|y-@A3g^KuUP8Dbb z_cQ?gs-3hE{4x~K={}7ckHgiWK7>PTK%owDCi#sQpl;DR$uFM(?T0>R1#awPE)QrB zy~ql@ez8!XFG+4kat;96EQ!~O+rUGBezgD6nFFu`$Nk}IwNKMftq*aoFkBrWQd(su zFkG!dJ6wTyhYM{pdM83h2=v#^@1q=AdAAesBBM04N}xAJYv?F}#`~N{3-oP)+ITMw z@g9+QZM<0q=q;hO^X?F!SA^EVTMvNV71}7CLjZc*hp_*^c*2QQtw3fMQy;^POwfMn zLl}qvEs%J9>I{K8gx1IPX-KJ0XMcb0Ce_bX5;*@Uv^hT1)j^pH)CQr=66gTFxd_g) z1v-eM6QC1E*Uw*puO)6!w_=>TXG%ww-%e~%=Ylpe+mRgr^dXWPuD;n%XsMbWBJJ9F zgjTCXp&>x-l)LsLgl$c5o-|iO*hK{N@H|3isUwB+_cI9P)iDCypV^TfQ0J;s1p0WY zhSmtQE=}k>l@lq0({`l)q|R6C1iF9e{iq=qC~SWqg-(GkRO2q9j0+S8c|Bz9z^xZ;RHT~v^1Ax9EGWP(K zR9{x#mb{<6;DjXu82_IW+S$_yZB;)J%P*Tv=r*-YI5!LDU4U3BPo!7Dx_7HzNWAl$ z%LmR3-K|~?vDbL$(8~u_t8b_`g!8x=mk$i6Z>e{M^Vx-jzC#Fk|LM5P2R5nitG^2E zLBt!teS*JAZa;v`0rd!`IkdzBZ5rAk&^PvAdQYkxcoPLWZmFhC!W3_~I&BhD ze^E^~Skix-LTHt&x2Gk!EF1av;DTMx_?i1RNruCz~{6(22IhRenZvKG!tHRDEpqm8x zyNU{Qmk-5FmhHC$`b1R=ZH7SqQndn&?KKwNO_uG{#e_b?&vY^MOQsT1p>C7q zci7xJIIRuwcm6QK_TSM*+MWWv)JG^3>J_Ma0-}z;)DptF9H~DtT|=HghX}1Lbh>#yIN!!#I-oj2 zXAAT(21P=J3fiD)cB1aqYT7xbiFnVTEe)tqq4UaUqeB-6?FM9gK1llf~M}*!L=+Fq`tqQ$Y zCiCdf`(;v&4Si%*p&a&0agSkj==Wuu$A|u>3_3CNSF;A3Tq&$pCx<=}DF!zQ4e z6{;iOw@^Sn6zP}4Alv3oYbtrP)eW^1iCoXA<);Oh{DqOWdTL-B+}cIekxq5-@ajlN-C4i8aHslf;+KdOPmub1;mp*(Hgeg}sDbLp zvY~V46aSBfH^FmJ-D_}96!%HNl!vthjd^K=j`cR=?6H7yzAJ8{xciA)BkoTplKPpX z_0eL6Zx{R*#2wj7%&PH}c4xzHM%wnVgzI)poJZFJKv17*-0YPj+j`z`{{{ z58tU)iY1>G{tT=UQu_+#$B3Iyf1mOpQkgLC4{#lE-as40{c3Ps84z{;F

%yVgdsasl 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 E52bc1{Qv*} literal 0 HcmV?d00001 diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.dll.meta b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.dll.meta new file mode 100644 index 00000000..1999cc3d --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 82b5580251f2d9545a4a066c81543415 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.xml b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.xml new file mode 100644 index 00000000..6c69332a --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.xml @@ -0,0 +1,5715 @@ + + + + Meryel.UnityCodeAssist.Serilog + + + +

+ Create properties based on an ordered list of provided values. + + The template that the parameters apply to. + Objects corresponding to the properties + represented in the message template. + A list of properties; if the template is malformed then + this will be empty. + + + + Implemented on types that apply settings to a logger configuration. + + + + + Apply the settings to the logger configuration. + + The logger configuration to apply settings to. + + + + Controls audit sink configuration. + + + + + Audit log events to the specified . + + The sink. + The minimum level for + events passed through the sink. Ignored when is specified. + A switch allowing the pass-through minimum level + to be changed at runtime. + Configuration object allowing method chaining. + + + + Audit log events to the specified . + + The sink. + The minimum level for + events passed through the sink. Ignored when is specified. + A switch allowing the pass-through minimum level + to be changed at runtime. + Configuration object allowing method chaining. + + + + Audit log events to a sub-logger, where further processing may occur. Events through + the sub-logger will be constrained by filters and enriched by enrichers that are + active in the parent. A sub-logger cannot be used to log at a more verbose level, but + a less verbose level is possible. + + An action that configures the sub-logger. + The minimum level for + events passed through the sink. Ignored when is specified. + A switch allowing the pass-through minimum level + to be changed at runtime. + Configuration object allowing method chaining. + + + + Audit log events to a sub-logger, where further processing may occur. Events through + the sub-logger will be constrained by filters and enriched by enrichers that are + active in the parent. A sub-logger cannot be used to log at a more verbose level, but + a less verbose level is possible. + + The sub-logger. This will not be shut down automatically when the + parent logger is disposed. + The minimum level for + events passed through the sink. + Configuration object allowing method chaining. + + + + Controls template parameter destructuring configuration. + + + + + Treat objects of the specified type as scalar values, i.e., don't break + them down into properties even when destructuring complex types. + + Type to treat as scalar. + Configuration object allowing method chaining. + When is null + + + + Treat objects of the specified type as scalar values, i.e., don't break + them down into properties even when destructuring complex types. + + Type to treat as scalar. + Configuration object allowing method chaining. + + + + When destructuring objects, transform instances with the provided policies. + + Policies to apply when destructuring. + Configuration object allowing method chaining. + When is null + When any element of is null + + + + When destructuring objects, transform instances with the provided policy. + + Policy to apply when destructuring. + Configuration object allowing method chaining. + + + + Capture instances of the specified type as dictionaries. + By default, only concrete instantiations of are considered dictionary-like. + + Type of dictionary. + Configuration object allowing method chaining. + + + + When destructuring objects, transform instances of the specified type with + the provided function. + + Function mapping instances of + to an alternative representation. + Type of values to transform. + Configuration object allowing method chaining. + When is null + + + + When destructuring objects, transform instances of the specified type with + the provided function, if the predicate returns true. Be careful to avoid any + intensive work in the predicate, as it can slow down the pipeline significantly. + + A predicate used to determine if the transform applies to + a specific type of value + Function mapping instances of + to an alternative representation. + Type of values to transform. + Configuration object allowing method chaining. + When is null + When is null + + + + When destructuring objects, depth will be limited to 10 property traversals deep to + guard against ballooning space when recursive/cyclic structures are accidentally passed. To + change this limit pass a new maximum depth. + + The maximum depth to use. + Configuration object allowing method chaining. + When is negative + + + + When destructuring objects, string values can be restricted to specified length + thus avoiding bloating payload. Limit is applied to each value separately, + sum of length of strings can exceed limit. + + The maximum string length. + Configuration object allowing method chaining. + When is less than 2 + + + + When destructuring objects, collections be restricted to specified count + thus avoiding bloating payload. Limit is applied to each collection separately, + sum of length of collection can exceed limit. + Applies limit to all including dictionaries. + + Configuration object allowing method chaining. + When is less than 1 + + + + Controls enrichment configuration. + + + + + Specifies one or more enrichers that may add properties dynamically to + log events. + + Enrichers to apply to all events passing through + the logger. + Configuration object allowing method chaining. + When is null + When any element of is null + + + + Specifies an enricher that may add properties dynamically to + log events. + + Enricher type to apply to all events passing through + the logger. + Configuration object allowing method chaining. + + + + Include the specified property value in all events logged to the logger. + + The name of the property to add. + The property value to add. + If , objects of unknown type will be logged as structures; otherwise they will be converted using . + Configuration object allowing method chaining. + + + + Enrich log events with properties from . + + Configuration object allowing method chaining. + + Configuration object allowing method chaining. + + + + Apply an enricher only when evaluates to true. + + A predicate that evaluates to true when the supplied + should be enriched. + An action that configures the wrapped enricher. + Configuration object allowing method chaining. + When is null + When is null + + + + Apply an enricher only to events with a greater than or equal to . + + The level from which the enricher will be applied. + An action that configures the wrapped enricher. + Configuration object allowing method chaining. + This method permits additional information to be attached to e.g. warnings and errors, that might be too expensive + to collect or store at lower levels. + When is null + + + + Apply an enricher only to events with a greater than or equal to the level specified by . + + A that specifies the level from which the enricher will be applied. + An action that configures the wrapped enricher. + Configuration object allowing method chaining. + This method permits additional information to be attached to e.g. warnings and errors, that might be too expensive + to collect or store at lower levels. + When is null + + + + Helper method for wrapping sinks. + + The parent enrichment configuration. + A function that allows for wrapping s + added in . + An action that configures enrichers to be wrapped in . + Configuration object allowing method chaining. + When is null + When is null + When is null + + + + Controls filter configuration. + + + + + Filter out log events from the stream based on the provided filter. + + The filters to apply. + Configuration object allowing method chaining. + When is null + When any element of is null + + + + Filter out log events from the stream based on the provided filter. + + The filters to apply. + Configuration object allowing method chaining. + + + + Filter out log events that match a predicate. + + Function that returns true when an event + should be excluded (silenced). + Configuration object allowing method chaining. + + + + Filter log events to include only those that match a predicate. + + Function that returns true when an event + should be included (emitted). + Configuration object allowing method chaining. + + + + Controls sink configuration. + + + + + Sets the minimum level at which events will be passed to sinks. + + The minimum level to set. + Configuration object allowing method chaining. + + + + Sets the minimum level to be dynamically controlled by the provided switch. + + The switch. + Configuration object allowing method chaining. + When is null + + + + Anything and everything you might want to know about + a running block of code. + + Configuration object allowing method chaining. + + + + Internal system events that aren't necessarily + observable from the outside. + + Configuration object allowing method chaining. + + + + The lifeblood of operational intelligence - things + happen. + + Configuration object allowing method chaining. + + + + Service is degraded or endangered. + + Configuration object allowing method chaining. + + + + Functionality is unavailable, invariants are broken + or data is lost. + + Configuration object allowing method chaining. + + + + If you have a pager, it goes off when one of these + occurs. + + Configuration object allowing method chaining. + + + + Override the minimum level for events from a specific namespace or type name. + This API is not supported for configuring sub-loggers (created through ). Use or instead. + You also might consider using https://github.com/serilog/serilog-filters-expressions. + + The (partial) namespace or type name to set the override for. + The switch controlling loggers for matching sources. + Configuration object allowing method chaining. + When is null + When a trimmed is empty + When is null + + + + Override the minimum level for events from a specific namespace or type name. + This API is not supported for configuring sub-loggers (created through ). Use or instead. + You also might consider using https://github.com/serilog/serilog-filters-expressions. + + The (partial) namespace or type name to set the override for. + The minimum level applied to loggers for matching sources. + Configuration object allowing method chaining. + When is null + + + + Allows additional setting sources to drive the logger configuration. + + + + + Apply external settings to the logger configuration. + + Configuration object allowing method chaining. + When is null + + + + Apply settings specified in the Serilog key-value setting format to the logger configuration. + + A list of key-value pairs describing logger settings. + Configuration object allowing method chaining. + In case of duplicate keys, the last value for the key is kept and the previous ones are ignored. + When is null + + + + Controls sink configuration. + + + + + Write log events to the specified . + + The sink. + The minimum level for + events passed through the sink. + + Configuration object allowing method chaining. + Sink configuration methods that specify should also specify . + + + + Write log events to the specified . + + The sink. + The minimum level for + events passed through the sink. Ignored when is specified. + A switch allowing the pass-through minimum level + to be changed at runtime. + Configuration object allowing method chaining. + + + + Write log events to the specified . + + The sink. + The minimum level for + events passed through the sink. Ignored when is specified. + A switch allowing the pass-through minimum level + to be changed at runtime. + Configuration object allowing method chaining. + + + + Write log events to a sub-logger, where further processing may occur. Events through + the sub-logger will be constrained by filters and enriched by enrichers that are + active in the parent. A sub-logger cannot be used to log at a more verbose level, but + a less verbose level is possible. + + An action that configures the sub-logger. + The minimum level for + events passed through the sink. Ignored when is specified. + A switch allowing the pass-through minimum level + to be changed at runtime. Can be null + Configuration object allowing method chaining. + When is null + + + + Write log events to a sub-logger, where further processing may occur. Events through + the sub-logger will be constrained by filters and enriched by enrichers that are + active in the parent. A sub-logger cannot be used to log at a more verbose level, but + a less verbose level is possible. + + The sub-logger. This will not be shut down automatically when the + parent logger is disposed. + The minimum level for + events passed through the sink. + Configuration object allowing method chaining. + When is null + + + + Write log events to a sub-logger, where further processing may occur. Events through + the sub-logger will be constrained by filters and enriched by enrichers that are + active in the parent. A sub-logger cannot be used to log at a more verbose level, but + a less verbose level is possible. + + The sub-logger. + Whether to shut down automatically the sub-logger + when the parent logger is disposed. + The minimum level for + events passed through the sink. + A switch allowing the pass-through minimum level + to be changed at runtime. Can be null + Configuration object allowing method chaining. + When is null + + + + Write to a sink only when evaluates to true. + + A predicate that evaluates to true when the supplied + should be written to the configured sink. + An action that configures the wrapped sink. + Configuration object allowing method chaining. + When is null + When is null + + + + Helper method for wrapping sinks. + + The parent sink configuration. + A function that allows for wrapping s + added in . + An action that configures sinks to be wrapped in . + The minimum level for + events passed through the sink. Ignored when is specified. + A switch allowing the pass-through minimum level + to be changed at runtime. Can be null + Configuration object allowing method chaining. + When is null + When is null + When is null + + + + Holds ambient properties that can be attached to log events. To + configure, use the method. + + + Configuration: + + var log = new LoggerConfiguration() + .Enrich.FromLogContext() + ... + + Usage: + + using (LogContext.PushProperty("MessageId", message.Id)) + { + Log.Information("The MessageId property will be attached to this event"); + } + + + The scope of the context is the current logical thread, using AsyncLocal + (and so is preserved across async/await calls). + + + + Push a property onto the context, returning an + that must later be used to remove the property, along with any others that + may have been pushed on top of it and not yet popped. The property must + be popped from the same thread/logical call context. + + The name of the property. + The value of the property. + A handle to later remove the property from the context. + If , and the value is a non-primitive, non-array type, + then the value will be converted to a structure; otherwise, unknown types will + be converted to scalars, which are generally stored as strings. + A token that must be disposed, in order, to pop properties back off the stack. + + + + Push an enricher onto the context, returning an + that must later be used to remove the property, along with any others that + may have been pushed on top of it and not yet popped. The property must + be popped from the same thread/logical call context. + + An enricher to push onto the log context + A token that must be disposed, in order, to pop properties back off the stack. + When is null + + + + Push multiple enrichers onto the context, returning an + that must later be used to remove the property, along with any others that + may have been pushed on top of it and not yet popped. The property must + be popped from the same thread/logical call context. + + . + Enrichers to push onto the log context + A token that must be disposed, in order, to pop properties back off the stack. + When is null + + + + Obtain an enricher that represents the current contents of the . This + can be pushed back onto the context in a different location/thread when required. + + An enricher that represents the current contents of the . + + + + Remove all enrichers from the , returning an + that must later be used to restore enrichers that were on the stack before was called. + + A token that must be disposed, in order, to restore properties back to the stack. + + + + Remove all enrichers from for the current async scope. + + + + + Constants used in the core logging pipeline and associated types. + + + + + The name of the property included in the emitted log events + when ForContext<T>() and overloads are + applied. + + + + + Adds a new property enricher to the log event. + + + + + Create a new property enricher. + + The name of the property. + The value of the property. + If , and the value is a non-primitive, non-array type, + then the value will be converted to a structure; otherwise, unknown types will + be converted to scalars, which are generally stored as strings. + When is null + When is empty or only contains whitespace + + + + Enrich the log event. + + The log event to enrich. + Factory for creating new properties to add to the event. + When is null + When is null + + + + Determine how, when destructuring, a supplied value is represented + as a complex log event property. + + + + + If supported, destructure the provided value. + + The value to destructure. + Recursively apply policies to destructure additional values. + The destructured value, or null. + True if the value could be destructured under this policy. + + + + Applied during logging to add additional information to log events. + + + + + Enrich the log event. + + The log event to enrich. + Factory for creating new properties to add to the event. + + + + Provides filtering of the log event stream. + + + + + Returns true if the provided event is enabled. Otherwise, . + + The event to test. + if the event is enabled by this filter. If + is returned, the event will not be emitted. + + + + Creates log event properties from regular .NET objects, applying policies as + required. + + + + + Construct a with the specified name and value. + + The name of the property. + The value of the property. + If , and the value is a non-primitive, non-array type, + then the value will be converted to a structure; otherwise, unknown types will + be converted to scalars, which are generally stored as strings. + Created instance. + + + + Supports the policy-driven construction of s given + regular .NET objects. + + + + + Create a given a .NET object and destructuring + strategy. + + The value of the property. + If , and the value is a non-primitive, non-array type, + then the value will be converted to a structure; otherwise, unknown types will + be converted to scalars, which are generally stored as strings. + The value. + + + + A destination for log events. + + + + + Emit the provided log event to the sink. + + The log event to write. + + + + Determine how a simple value is carried through the logging + pipeline as an immutable . + + + + + If supported, convert the provided value into an immutable scalar. + + The value to convert. + The converted value, or null. + True if the value could be converted under this policy. + + + + The core Serilog logging pipeline. A must + be disposed to flush any events buffered within it. Most application + code should depend on , not this class. + + + + + Create a logger that enriches log events via the provided enrichers. + + Enricher that applies in the context. + A logger that will enrich log events as specified. + + + + Create a logger that enriches log events via the provided enrichers. + + Enrichers that apply in the context. + A logger that will enrich log events as specified. + + + + Create a logger that enriches log events with the specified property. + + The name of the property. Must be non-empty. + The property value. + If , the value will be serialized as a structured + object if possible; if , the object will be recorded as a scalar or simple array. + A logger that will enrich log events as specified. + + + + Create a logger that marks log events as being from the specified + source type. + + Type generating log messages in the context. + A logger that will enrich log events as specified. + + + + Create a logger that marks log events as being from the specified + source type. + + Type generating log messages in the context. + A logger that will enrich log events as specified. + + + + Write a log event with the specified level. + + The level of the event. + Message template describing the event. + + + + Write a log event with the specified level. + + The level of the event. + Message template describing the event. + Object positionally formatted into the message template. + + + + Write a log event with the specified level. + + The level of the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + + + Write a log event with the specified level. + + The level of the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + + + Write a log event with the specified level. + + The level of the event. + + + + + + Determine if events at the specified level, and higher, will be passed through + to the log sinks. + + Level to check. + if the level is enabled; otherwise, . + + + + Write a log event with the specified level and associated exception. + + The level of the event. + Exception related to the event. + Message template describing the event. + + + + Write a log event with the specified level and associated exception. + + The level of the event. + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + + + Write a log event with the specified level and associated exception. + + The level of the event. + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + + + Write a log event with the specified level and associated exception. + + The level of the event. + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + + + Write a log event with the specified level and associated exception. + + The level of the event. + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + + + Write an event to the log. + + The event to write. + + + + Write a log event with the level. + + Message template describing the event. + + Log.Verbose("Staring into space, wondering if we're alone."); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + + Log.Verbose("Staring into space, wondering if we're alone."); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Verbose("Staring into space, wondering if we're alone."); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Verbose("Staring into space, wondering if we're alone."); + + + + + Write a log event with the level and associated exception. + + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Verbose("Staring into space, wondering if we're alone."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + + Log.Verbose(ex, "Staring into space, wondering where this comet came from."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + Log.Verbose(ex, "Staring into space, wondering where this comet came from."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Verbose(ex, "Staring into space, wondering where this comet came from."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Verbose(ex, "Staring into space, wondering where this comet came from."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Verbose(ex, "Staring into space, wondering where this comet came from."); + + + + + Write a log event with the level. + + Message template describing the event. + + Log.Debug("Starting up at {StartedAt}.", DateTime.Now); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + + Log.Debug("Starting up at {StartedAt}.", DateTime.Now); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Debug("Starting up at {StartedAt}.", DateTime.Now); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Debug("Starting up at {StartedAt}.", DateTime.Now); + + + + + Write a log event with the level and associated exception. + + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Debug("Starting up at {StartedAt}.", DateTime.Now); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + + Log.Debug(ex, "Swallowing a mundane exception."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + Log.Debug(ex, "Swallowing a mundane exception."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Debug(ex, "Swallowing a mundane exception."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Debug(ex, "Swallowing a mundane exception."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Debug(ex, "Swallowing a mundane exception."); + + + + + Write a log event with the level. + + Message template describing the event. + + Log.Information("Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + + Log.Information("Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Information("Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Information("Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level and associated exception. + + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Information("Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + + Log.Information(ex, "Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + Log.Information(ex, "Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Information(ex, "Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Information(ex, "Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Information(ex, "Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level. + + Message template describing the event. + + Log.Warning("Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + + Log.Warning("Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Warning("Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Warning("Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level and associated exception. + + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Warning("Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + + Log.Warning(ex, "Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + Log.Warning(ex, "Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Warning(ex, "Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Warning(ex, "Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Warning(ex, "Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + + Log.Error("Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + + Log.Error("Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Error("Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Error("Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level and associated exception. + + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Error("Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + + Log.Error(ex, "Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + Log.Error(ex, "Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Error(ex, "Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Error(ex, "Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Error(ex, "Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + + Log.Fatal("Process terminating."); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + + Log.Fatal("Process terminating."); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Fatal("Process terminating."); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Fatal("Process terminating."); + + + + + Write a log event with the level and associated exception. + + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Fatal("Process terminating."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + + Log.Fatal(ex, "Process terminating."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + Log.Fatal(ex, "Process terminating."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Fatal(ex, "Process terminating."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Fatal(ex, "Process terminating."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Fatal(ex, "Process terminating."); + + + + + Uses configured scalar conversion and destructuring rules to bind a set of properties to a + message template. Returns false if the template or values are invalid (ILogger + methods never throw exceptions). + + Message template describing an event. + Objects positionally formatted into the message template. + The internal representation of the template, which may be used to + render the as text. + Captured properties from the template and . + + MessageTemplate template; + IEnumerable<LogEventProperty> properties>; + if (Log.BindMessageTemplate("Hello, {Name}!", new[] { "World" }, out template, out properties) + { + var propsByName = properties.ToDictionary(p => p.Name, p => p.Value); + Console.WriteLine(template.Render(propsByName, null)); + // -> "Hello, World!" + } + + + + + Uses configured scalar conversion and destructuring rules to bind a property value to its captured + representation. + + The name of the property. Must be non-empty. + The property value. + If , the value will be serialized as a structured + object if possible; if , the object will be recorded as a scalar or simple array. + The resulting property. + True if the property could be bound, otherwise false (ILogger + methods never throw exceptions). + + + + Close and flush the logging pipeline. + + + + + An instance that efficiently ignores all method calls. + + + + + Dynamically controls logging level. + + + + + Create a at the initial + minimum level. + + The initial level to which the switch is set. + + + + The event arises when changed. Note that the event is raised + under a lock so be careful within event handler to not fall into deadlock. + + + + + The current minimum level, below which no events + should be generated. + + + + + Event arguments for event. + + + + + Creates an instance of specifying old and new levels. + + Old level. + New level. + + + + Old level. + + + + + New level. + + + + + Indicates that the marked method logs data using a message template and (optional) arguments. + The name of the parameter which contains the message template should be given in the constructor. + + + + [MessageTemplateFormatMethod("messageTemplate")] + public void Information(string messageTemplate, params object[] propertyValues) + { + // Do something + } + + public void Foo() + { + Information("Hello, {Name}!") // Warning: Non-existing argument in message template. + } + + + + + + Initializes a new instance of the class. + + Name of the message template parameter. + + + + Gets the name of the message template parameter. + + The name of the message template parameter. + + + + Forwards log events to another logging pipeline. Copies the events so + that mutations performed on the copies do not affect the originals. + + The properties dictionary is copied, however the values within + the dictionary (of type are expected to + be immutable. + + + + A base class for visitors that rewrite the value with modifications. For example, implementations + might remove all structure properties with a certain name, apply size/length limits, or convert scalar properties of + one type into scalar properties of another. + + + + + + Visit a value. + + Operation state. + The value to visit. + The result of visiting . + When is null + + + + Visit a value. + + Operation state. + The value to visit. + The result of visiting . + When is null + + + + Visit a value. + + Operation state. + The value to visit. + The result of visiting . + When is null + + + + Visit a value. + + Operation state. + The value to visit. + The result of visiting . + When is null + + + + Visit a value of an unsupported type. Returns the value unchanged. + + Operation state. + The value to visit. + The result of visiting . + + + + An abstract base class for visitors that walk data in the + format. Subclasses, by + overriding appropriate methods, may search for, transform, + or print the value structures being visited. + + + Stateless, designed to accommodate allocation-free visiting of multiple + values by the same visitor instance. + + The type of a state object passed through + the visiting process. + The type of the result generated by visiting + a node. + + + + Visit the root node type. This method delegates to + a concrete Visit*Value() method appropriate for the value. + + Operation state. + The value to visit. + The result of visiting . + When is null + + + + Visit a value. + + Operation state. + The value to visit. + The result of visiting . + + + + Visit a value. + + Operation state. + The value to visit. + The result of visiting . + + + + Visit a value. + + Operation state. + The value to visit. + The result of visiting . + + + + Visit a value. + + Operation state. + The value to visit. + The result of visiting . + + + + Visit a value of an unsupported type. Always throws , when is not overridden. + + Operation state. + The value to visit. + The result of visiting . + When is null + Always + + + + May be thrown by log event sinks when a failure occurs. Should not be used in cases + where the exception would propagate out to callers. + + + + + Construct a to communicate a logging failure. + + A message describing the logging failure. + + + + A simple source of information generated by Serilog itself, + for example when exceptions are thrown and caught internally. + + + + + Set the output mechanism for self-log messages. + + A synchronized to which + self-log messages will be written. + When is null + + + + Set the output mechanism for self-log messages. + + An action to invoke with self-log messages. + // ReSharper disable once MemberCanBePrivate.Global + When is null + + + + Clear the output mechanism and disable self-log events. + + // ReSharper disable once MemberCanBePrivate.Global + + + + Write a message to the self-log. + + Standard .NET format string containing the message. + First argument, if supplied. + Second argument, if supplied. + Third argument, if supplied. + + The name is historical; because this is used from third-party sink packages, removing the "Line" + suffix as would seem sensible isn't worth the breakage. + + + + + A value represented as a mapping from keys to values. + + + + + Create a with the provided . + + The key-value mappings represented in the dictionary. + When is null + + + + The dictionary mapping. + + + + + Render the value to the output. + + The output. + A format string applied to the value, or null. + A format provider to apply to the value, or null to use the default. + . + When is null + + + + A property associated with a . + + This type is currently internal, while we consider future directions for the logging pipeline, but should end up public + in future. + + + + No property. + + + + + The name of the property. + + + + + The value of the property. + + + + + Construct a with the specified name and value. + + The name of the property. + The value of the property. + When is null + When is empty or only contains whitespace + When is null + + + + Permit deconstruction of the property into a name/value pair. + + The name of the property. + The value of the property. + + + + + + Indicates whether this instance and a specified are equal. + The to compare with the current instance. + + if and this instance represent the same value; otherwise, . + + + + + + + Descriptive aliases for . + + These do not appear as members of the enumeration + as duplicated underlying values result in issues when presenting + enum values with . + + + + The least significant level of event. + + + + + The most significant level of event. + + + + + A value that, when used as a "minimum" level, will result in no + events being emitted. + + It is never correct to construct a with this value. + + + + A log event. + + + + + Construct a new . + + The time at which the event occurred. + The level of the event. + An exception associated with the event, or null. + The message template describing the event. + Properties associated with the event, including those presented in . + When is null + When is null + + + + Construct a new . + + The time at which the event occurred. + The level of the event. + An exception associated with the event, or null. + The message template describing the event. + Properties associated with the event, including those presented in . + When is null + When is null + + + + The time at which the event occurred. + + + + + The level of the event. + + + + + The message template describing the event. + + + + + Render the message template to the specified output, given the properties associated + with the event. + + The output. + Supplies culture-specific formatting information, or null. + + + + Render the message template given the properties associated + with the event, and return the result. + + Supplies culture-specific formatting information, or null. + + + + Properties associated with the event, including those presented in . + + + + + An exception associated with the event, or null. + + + + + Add a property to the event if not already present, otherwise, update its value. + + The property to add or update. + When is null + + + + Add a property to the event if not already present, otherwise, update its value. + + The property to add or update. + When is default + + + + Add a property to the event if not already present. + + The property to add. + When is null + + + + Add a property to the event if not already present. + + The property to add. + When is default + + + + Remove a property from the event, if present. Otherwise no action + is performed. + + The name of the property to remove. + + + + Specifies the meaning and relative importance of a log event. + + + + + Anything and everything you might want to know about + a running block of code. + + + + + Internal system events that aren't necessarily + observable from the outside. + + + + + The lifeblood of operational intelligence - things + happen. + + + + + Service is degraded or endangered. + + + + + Functionality is unavailable, invariants are broken + or data is lost. + + + + + If you have a pager, it goes off when one of these + occurs. + + + + + A property associated with a . + + + + + Construct a with the specified name and value. + + The name of the property. + The value of the property. + When is null + When is empty or only contains whitespace + When is null + + + + Construct a from an existing instance. + + The existing property. + When is default + + + + The name of the property. + + + + + The value of the property. + + + + + Test to determine if it is a valid property name. + + The name to check. + if the name is valid; otherwise, . + + + When is null + When is empty or only contains whitespace + + + + The value associated with a . Divided into scalar, + sequence and structure values to direct serialization into various formats. + + + + + Render the value to the output. + + The output. + A format string applied to the value, or null. + A format provider to apply to the value, or null to use the default. + . + + + + Returns a string that represents the current object. + + + A string that represents the current object. + + 2 + + + + Formats the value of the current instance using the specified format. + + + The value of the current instance in the specified format. + + The format to use.-or- A null reference (Nothing in Visual Basic) to use + the default format defined for the type of the implementation. + The provider to use to format the value.-or- A null reference + (Nothing in Visual Basic) to obtain the numeric format information from the current locale + setting of the operating system. 2 + + + + Represents a message template passed to a log method. The template + can subsequently render the template in textual form given the list + of properties. + + + + + Represents the empty message template. + + + + + Construct a message template using manually-defined text and property tokens. + + The text and property tokens defining the template. + + + + Construct a message template using manually-defined text and property tokens. + + The full text of the template; used by Serilog internally to avoid unneeded + string concatenation. + The text and property tokens defining the template. + When is null + When is null + + + + Similar to , but faster. + + + + + The raw text describing the template. + + + + + Render the template as a string. + + The string representation of the template. + + + + The tokens parsed from the template. + + + + + Convert the message template into a textual message, given the + properties matching the tokens in the message template. + + Properties matching template tokens. + Supplies culture-specific formatting information, or null. + The message created from the template and properties. If the + properties are mismatched with the template, the template will be + returned with incomplete substitution. + When is null + + + + Convert the message template into a textual message, given the + properties matching the tokens in the message template. + + Properties matching template tokens. + The message created from the template and properties. If the + properties are mismatched with the template, the template will be + returned with incomplete substitution. + Supplies culture-specific formatting information, or null. + When is null + When is null + + + + A property value corresponding to a simple, scalar type. + + + + + Scalar value representing . + + + + + Construct a with the specified + value. + + The value, which may be null. + + + + The value, which may be null. + + + + + Render the value to the output. + + The output. + A format string applied to the value, or null. + A format provider to apply to the value, or null to use the default. + . + When is null + + + When is null + + + + Determine if this instance is equal to . + + The instance to compare with. + if the instances are equal; otherwise, . + + + + Get a hash code representing the value. + + The instance's hash code. + + + + A value represented as an ordered sequence of values. + + + + + Empty sequence of values. + + + + + Create a with the provided . + + The elements of the sequence. + When is null + + + + The elements of the sequence. + + + + + Render the value to the output. + + The output. + A format string applied to the value, or null. + A format provider to apply to the value, or null to use the default. + . + When is null + + + + A value represented as a collection of name-value properties. + + + + + Construct a with the provided properties. + + Optionally, a piece of metadata describing the "type" of the + structure. Can be null. + The properties of the structure. + When is null + + + + A piece of metadata describing the "type" of the + structure, or null. + + + + + The properties of the structure. + + Not presented as a dictionary because dictionary construction is + relatively expensive; it is cheaper to build a dictionary over properties only + when the structure is of interest. + + + + Render the value to the output. + + The output. + A format string applied to the value, or null. + A format provider to apply to the value, or null to use the default. + . + When is null + + + + Predicates applied to log events that can be used + + + + + Matches events from the specified source type. + + The source type. + A predicate for matching events. + + + + Matches events from the specified source type or namespace and + nested types or namespaces. + + A dotted source type or namespace identifier. + A function that matches log events emitted by the source. + When is null + + + + Matches events with the specified property attached, + regardless of its value. + + The name of the property to match. + A predicate for matching events. + When is null + + + + Matches events with the specified property value. + + The name of the property to match. + The property value to match; must be a scalar type. + Null is allowed. + A predicate for matching events. + When is null + + + + Matches events with the specified property value. + + The name of the property to match. + A predicate for testing + The type of scalar values to match. + A predicate for matching events. + When is null + When is null + + + + Implements the {Level} element. + can now have a fixed width applied to it, as well as casing rules. + Width is set through formats like "u3" (uppercase three chars), + "w1" (one lowercase char), or "t4" (title case four chars). + + + + + A that supports the Serilog + message template format. Formatting log events for display + has a different set of requirements and expectations from + rendering the data within them. To meet this, the formatter + overrides some behavior: First, strings are always output + as literals (not quoted) unless some other format is applied + to them. Second, tokens without matching properties are skipped + rather than being written as raw text. + + + + + Construct a . + + A message template describing the + output messages. + Supplies culture-specific formatting information, or null. + When is null + + + + Format the log event into the output. + + The event to format. + The output. + When is null + When is null + + + + Describes the properties available in standard message template-based + output format strings. + + + + + The message rendered from the log event. + + + + + The timestamp of the log event. + + + + + The level of the log event. + + + + + A new line. + + + + + The exception associated with the log event. + + + + + The properties of the log event. + + + + + Formats log events in a textual representation. + + + + + Format the log event into the output. + + The event to format. + The output. + + + + Formats log events in a simple JSON structure. Instances of this class + are safe for concurrent access by multiple threads. + + New code should prefer formatters from Serilog.Formatting.Compact, or ExpressionTemplate from + Serilog.Expressions. + + + + Construct a . + + A string that will be written after each log event is formatted. + If null, will be used. + If , the message will be rendered and written to the output as a + property named RenderedMessage. + Supplies culture-specific formatting information, or null. + + + + Format the log event into the output. + + The event to format. + The output. + When is null + When is null + + + + Converts Serilog's structured property value format into JSON. + + + + + Construct a . + + When serializing structured (object) values, + the property name to use for the Serilog field + in the resulting JSON. If null, no type tag field will be written. The default is + "_typeTag". + + + + Format as JSON to . + + The value to format + The output + + + + Visit a value. + + Operation state. + The value to visit. + The result of visiting . + When is null + + + + Visit a value. + + Operation state. + The value to visit. + The result of visiting . + When is null + + + + Visit a value. + + Operation state. + The value to visit. + The result of visiting . + + + + Visit a value. + + Operation state. + The value to visit. + The result of visiting . + + + + Write a literal as a single JSON value, e.g. as a number or string. Override to + support more value types. Don't write arrays/structures through this method - the + active destructuring policies have already indicated the value should be scalar at + this point. + + The value to write. + The output + + + + Write a valid JSON string literal, escaping as necessary. + + The string value to write. + The output. + + + + The core Serilog logging API, used for writing log events. + + + var log = new LoggerConfiguration() + .WriteTo.Console() + .CreateLogger(); + + var thing = "World"; + log.Information("Hello, {Thing}!", thing); + + + The methods on (and its static sibling ) are guaranteed + never to throw exceptions. Methods on all other types may. + + + + + Create a logger that enriches log events via the provided enrichers. + + Enricher that applies in the context. + A logger that will enrich log events as specified. + + + + Create a logger that enriches log events via the provided enrichers. + + Enrichers that apply in the context. + A logger that will enrich log events as specified. + + + + Create a logger that enriches log events with the specified property. + + The name of the property. Must be non-empty. + The property value. + If , the value will be serialized as a structured + object if possible; if , the object will be recorded as a scalar or simple array. + A logger that will enrich log events as specified. + + + + Create a logger that marks log events as being from the specified + source type. + + Type generating log messages in the context. + A logger that will enrich log events as specified. + + + + Create a logger that marks log events as being from the specified + source type. + + Type generating log messages in the context. + A logger that will enrich log events as specified. + + + + Write an event to the log. + + The event to write. + + + + Write a log event with the specified level. + + The level of the event. + Message template describing the event. + + + + Write a log event with the specified level. + + The level of the event. + Message template describing the event. + Object positionally formatted into the message template. + + + + Write a log event with the specified level. + + The level of the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + + + Write a log event with the specified level. + + The level of the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + + + Write a log event with the specified level. + + The level of the event. + + + + + + Write a log event with the specified level and associated exception. + + The level of the event. + Exception related to the event. + Message template describing the event. + + + + Write a log event with the specified level and associated exception. + + The level of the event. + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + + + Write a log event with the specified level and associated exception. + + The level of the event. + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + + + Write a log event with the specified level and associated exception. + + The level of the event. + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + + + Write a log event with the specified level and associated exception. + + The level of the event. + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + + + Determine if events at the specified level will be passed through + to the log sinks. + + Level to check. + if the level is enabled; otherwise, . + + + + Write a log event with the level. + + Message template describing the event. + + Log.Verbose("Staring into space, wondering if we're alone."); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + + Log.Verbose("Staring into space, wondering if we're alone."); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Verbose("Staring into space, wondering if we're alone."); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Verbose("Staring into space, wondering if we're alone."); + + + + + Write a log event with the level and associated exception. + + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Verbose("Staring into space, wondering if we're alone."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + + Log.Verbose(ex, "Staring into space, wondering where this comet came from."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + Log.Verbose(ex, "Staring into space, wondering where this comet came from."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Verbose(ex, "Staring into space, wondering where this comet came from."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Verbose(ex, "Staring into space, wondering where this comet came from."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Verbose(ex, "Staring into space, wondering where this comet came from."); + + + + + Write a log event with the level. + + Message template describing the event. + + Log.Debug("Starting up at {StartedAt}.", DateTime.Now); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + + Log.Debug("Starting up at {StartedAt}.", DateTime.Now); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Debug("Starting up at {StartedAt}.", DateTime.Now); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Debug("Starting up at {StartedAt}.", DateTime.Now); + + + + + Write a log event with the level and associated exception. + + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Debug("Starting up at {StartedAt}.", DateTime.Now); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + + Log.Debug(ex, "Swallowing a mundane exception."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + Log.Debug(ex, "Swallowing a mundane exception."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Debug(ex, "Swallowing a mundane exception."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Debug(ex, "Swallowing a mundane exception."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Debug(ex, "Swallowing a mundane exception."); + + + + + Write a log event with the level. + + Message template describing the event. + + Log.Information("Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + + Log.Information("Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Information("Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Information("Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level and associated exception. + + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Information("Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + + Log.Information(ex, "Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + Log.Information(ex, "Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Information(ex, "Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Information(ex, "Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Information(ex, "Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level. + + Message template describing the event. + + Log.Warning("Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + + Log.Warning("Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Warning("Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Warning("Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level and associated exception. + + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Warning("Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + + Log.Warning(ex, "Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + Log.Warning(ex, "Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Warning(ex, "Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Warning(ex, "Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Warning(ex, "Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + + Log.Error("Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + + Log.Error("Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Error("Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Error("Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level and associated exception. + + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Error("Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + + Log.Error(ex, "Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + Log.Error(ex, "Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Error(ex, "Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Error(ex, "Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Error(ex, "Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + + Log.Fatal("Process terminating."); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + + Log.Fatal("Process terminating."); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Fatal("Process terminating."); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Fatal("Process terminating."); + + + + + Write a log event with the level and associated exception. + + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Fatal("Process terminating."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + + Log.Fatal(ex, "Process terminating."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + Log.Fatal(ex, "Process terminating."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Fatal(ex, "Process terminating."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Fatal(ex, "Process terminating."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Fatal(ex, "Process terminating."); + + + + + Uses configured scalar conversion and destructuring rules to bind a set of properties to a + message template. Returns false if the template or values are invalid (ILogger + methods never throw exceptions). + + Message template describing an event. + Objects positionally formatted into the message template. + The internal representation of the template, which may be used to + render the as text. + Captured properties from the template and . + + MessageTemplate template; + IEnumerable<LogEventProperty> properties; + if (Log.BindMessageTemplate("Hello, {Name}!", new[] { "World" }, out template, out properties) + { + var propsByName = properties.ToDictionary(p => p.Name, p => p.Value); + Console.WriteLine(template.Render(propsByName, null)); + // -> "Hello, World!" + } + + + + + Uses configured scalar conversion and destructuring rules to bind a property value to its captured + representation. + + The name of the property. Must be non-empty. + The property value. + If , the value will be serialized as a structured + object if possible; if , the object will be recorded as a scalar or simple array. + The resulting property. + True if the property could be bound, otherwise false (ILogger + methods never throw exceptions). + + + + An optional static entry point for logging that can be easily referenced + by different parts of an application. To configure the + set the Logger static property to a logger instance. + + + Log.Logger = new LoggerConfiguration() + .WithConsoleSink() + .CreateLogger(); + + var thing = "World"; + Log.Logger.Information("Hello, {Thing}!", thing); + + + The methods on (and its dynamic sibling ) are guaranteed + never to throw exceptions. Methods on all other types may. + + + + + The globally-shared logger. + + When is null + + + + Resets to the default and disposes the original if possible + + + + + Create a logger that enriches log events via the provided enrichers. + + Enricher that applies in the context. + A logger that will enrich log events as specified. + + + + Create a logger that enriches log events via the provided enrichers. + + Enrichers that apply in the context. + A logger that will enrich log events as specified. + + + + Create a logger that enriches log events with the specified property. + + A logger that will enrich log events as specified. + + + + Create a logger that marks log events as being from the specified + source type. + + Type generating log messages in the context. + A logger that will enrich log events as specified. + + + + Create a logger that marks log events as being from the specified + source type. + + Type generating log messages in the context. + A logger that will enrich log events as specified. + + + + Write an event to the log. + + The event to write. + + + + Write a log event with the specified level. + + The level of the event. + Message template describing the event. + + + + Write a log event with the specified level. + + The level of the event. + Message template describing the event. + Object positionally formatted into the message template. + + + + Write a log event with the specified level. + + The level of the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + + + Write a log event with the specified level. + + The level of the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + + + Write a log event with the specified level. + + The level of the event. + Message template describing the event. + Objects positionally formatted into the message template. + + + + Write a log event with the specified level and associated exception. + + The level of the event. + Exception related to the event. + Message template describing the event. + + + + Write a log event with the specified level and associated exception. + + The level of the event. + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + + + Write a log event with the specified level and associated exception. + + The level of the event. + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + + + Write a log event with the specified level and associated exception. + + The level of the event. + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + + + Write a log event with the specified level and associated exception. + + The level of the event. + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + + + Determine if events at the specified level will be passed through + to the log sinks. + + Level to check. + if the level is enabled; otherwise, . + + + + Write a log event with the level. + + Message template describing the event. + + Log.Verbose("Staring into space, wondering if we're alone."); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + + Log.Verbose("Staring into space, wondering if we're alone."); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Verbose("Staring into space, wondering if we're alone."); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Verbose("Staring into space, wondering if we're alone."); + + + + + Write a log event with the level. + + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Verbose("Staring into space, wondering if we're alone."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + + Log.Verbose(ex, "Staring into space, wondering where this comet came from."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + Log.Verbose(ex, "Staring into space, wondering where this comet came from."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Verbose(ex, "Staring into space, wondering where this comet came from."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Verbose(ex, "Staring into space, wondering where this comet came from."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Verbose(ex, "Staring into space, wondering where this comet came from."); + + + + + Write a log event with the level. + + Message template describing the event. + + Log.Debug("Starting up at {StartedAt}.", DateTime.Now); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + + Log.Debug("Starting up at {StartedAt}.", DateTime.Now); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Debug("Starting up at {StartedAt}.", DateTime.Now); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Debug("Starting up at {StartedAt}.", DateTime.Now); + + + + + Write a log event with the level. + + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Debug("Starting up at {StartedAt}.", DateTime.Now); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + + Log.Debug(ex, "Swallowing a mundane exception."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + Log.Debug(ex, "Swallowing a mundane exception."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Debug(ex, "Swallowing a mundane exception."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Debug(ex, "Swallowing a mundane exception."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Debug(ex, "Swallowing a mundane exception."); + + + + + Write a log event with the level. + + Message template describing the event. + + Log.Information("Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + + Log.Information("Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Information("Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Information("Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level. + + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Information("Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + + Log.Information(ex, "Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + Log.Information(ex, "Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Information(ex, "Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Information(ex, "Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Information(ex, "Processed {RecordCount} records in {TimeMS}.", records.Length, sw.ElapsedMilliseconds); + + + + + Write a log event with the level. + + Message template describing the event. + + Log.Warning("Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + + Log.Warning("Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Warning("Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Warning("Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Warning("Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + + Log.Warning(ex, "Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + Log.Warning(ex, "Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Warning(ex, "Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Warning(ex, "Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Warning(ex, "Skipped {SkipCount} records.", skippedRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + + Log.Error("Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + + Log.Error("Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Error("Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Error("Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Error("Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + + Log.Error(ex, "Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + Log.Error(ex, "Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Error(ex, "Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Error(ex, "Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Error(ex, "Failed {ErrorCount} records.", brokenRecords.Length); + + + + + Write a log event with the level. + + Message template describing the event. + + Log.Fatal("Process terminating."); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + + Log.Fatal("Process terminating."); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Fatal("Process terminating."); + + + + + Write a log event with the level. + + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Fatal("Process terminating."); + + + + + Write a log event with the level. + + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Fatal("Process terminating."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + + Log.Fatal(ex, "Process terminating."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + + Log.Fatal(ex, "Process terminating."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Fatal(ex, "Process terminating."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + Object positionally formatted into the message template. + + Log.Fatal(ex, "Process terminating."); + + + + + Write a log event with the level and associated exception. + + Exception related to the event. + Message template describing the event. + Objects positionally formatted into the message template. + + Log.Fatal(ex, "Process terminating."); + + + + + Uses configured scalar conversion and destructuring rules to bind a set of properties to a + message template. Returns false if the template or values are invalid (ILogger + methods never throw exceptions). + + Message template describing an event. + Objects positionally formatted into the message template. + The internal representation of the template, which may be used to + render the as text. + Captured properties from the template and . + + MessageTemplate template; + IEnumerable<LogEventProperty> properties>; + if (Log.BindMessageTemplate("Hello, {Name}!", new[] { "World" }, out template, out properties) + { + var propsByName = properties.ToDictionary(p => p.Name, p => p.Value); + Console.WriteLine(template.Render(propsByName, null)); + // -> "Hello, World!" + } + + + + + Uses configured scalar conversion and destructuring rules to bind a property value to its captured + representation. + + The name of the property. Must be non-empty. + The property value. + If , the value will be serialized as a structured + object if possible; if , the object will be recorded as a scalar or simple array. + The resulting property. + True if the property could be bound, otherwise false (ILogger + methods never throw exceptions). + + + + Configuration object for creating instances. + + + + + Construct a . + + + + + Configures the sinks that log events will be emitted to. + + + + + Configures sinks for auditing, instead of regular (safe) logging. When auditing is used, + exceptions from sinks and any intermediate filters propagate back to the caller. Most callers + should use instead. + + + Not all sinks are compatible with transactional auditing requirements (many will use asynchronous + batching to improve write throughput and latency). Sinks need to opt-in to auditing support by + extending , though the generic + method allows any sink class to be adapted for auditing. + + + + + Configures the minimum level at which events will be passed to sinks. If + not specified, only events at the + level and above will be passed through. + + Configuration object allowing method chaining. + + + + Configures enrichment of s. Enrichers can add, remove and + modify the properties associated with events. + + + + + Configures global filtering of s. + + + + + Configures destructuring of message template parameters. + + + + + Apply external settings to the logger configuration. + + + + + Create a logger using the configured sinks, enrichers and minimum level. + + The logger. + To free resources held by sinks ahead of program shutdown, + the returned logger may be cast to and + disposed. + When the logger is already created + + + + Extends with additional methods. + + + + + Create a logger that enriches log events when the specified level is enabled. + + The type of the property value. + The logger. + The log event level used to determine if log is enriched with property. + The name of the property. Must be non-empty. + The property value. + If , the value will be serialized as a structured + object if possible; if , the object will be recorded as a scalar or simple array. + A logger that will enrich log events as specified. + When is null + + + + A structure representing the alignment settings to apply when rendering a property. + + + + + Initializes a new instance of . + + The text alignment direction. + The width of the text, in characters. + + + + The text alignment direction. + + + + + The width of the text. + + + + + Defines the direction of the alignment. + + + + + Text will be left-aligned. + + + + + Text will be right-aligned. + + + + + Instructs the logger on how to store information about provided + parameters. + + + + + Convert known types and objects to scalars, arrays to sequences. + + + + + Convert all types to scalar strings. Prefix name with '$'. + + + + + Convert known types to scalars, destructure objects and collections + into sequences and structures. Prefix name with '@'. + + + + + Parses message template strings into sequences of text or property + tokens. + + + + + Parse the supplied message template. + + The message template to parse. + A sequence of text or property tokens. Where the template + is not syntactically valid, text tokens will be returned. The parser + will make a best effort to extract valid property tokens even in the + presence of parsing issues. + When is null + + + + An element parsed from a message template string. + + + + + The token's length. + + + + + Render the token to the output. + + Properties that may be represented by the token. + Output for the rendered string. + Supplies culture-specific formatting information, or null. + + + + A message template token representing a log event property. + + + + + Construct a . + + The name of the property. + The token as it appears in the message template. + The format applied to the property, if any. + The alignment applied to the property, if any. + The destructuring strategy applied to the property, if any. + When is null + When is null + + + + The token's length. + + + + + Render the token to the output. + + Properties that may be represented by the token. + Output for the rendered string. + Supplies culture-specific formatting information, or null. + When is null + When is null + + + + The property name. + + + + + Destructuring strategy applied to the property. + + + + + Format applied to the property. + + + + + Alignment applied to the property. + + + + + if the property name is a positional index; otherwise, . + + + + + Try to get the integer value represented by the property name. + + The integer value, if present. + True if the property is positional, otherwise false. + + + + Determines whether the specified is equal to the current . + + + if the specified object is equal to the current object; otherwise, . + + The object to compare with the current object. 2 + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + 2 + + + + Returns a string that represents the current object. + + + A string that represents the current object. + + 2 + + + + A message template token representing literal text. + + + + + Construct a . + + The text of the token. + When is null + + + + The token's length. + + + + + Render the token to the output. + + Properties that may be represented by the token. + Output for the rendered string. + Supplies culture-specific formatting information, or null. + When is null + + + + Determines whether the specified is equal to the current . + + + if the specified object is equal to the current object; otherwise, . + + The object to compare with the current object. 2 + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + 2 + + + + Returns a string that represents the current object. + + + A string that represents the current object. + + 2 + + + + The text of the token. + + + + + Apply upper or lower casing to when is provided. + Returns when no or invalid format provided + + The provided with formatting applied + + + + Writes the provided value to the output, applying direction-based padding when is provided. + + + + + Class that provides reusable StringWriters to reduce memory allocations + + + + + Gets already created StringWriter if there is one available or creates a new one. + + + + + + Clear this instance and prepare it for reuse in the future. + + + + + Contains "fake extension" methods for the Serilog configuration API. + By default the settings knows how to find extension methods, but some configuration + are actually "regular" method calls and would not be found otherwise. + + This static class contains internal methods that can be used instead. + + See also + + + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + + Specifies that null is disallowed as an input even if the corresponding type allows it. + + + + + Applied to a method that will never return under any circumstance. + + + + + Specifies that the method will not return if the associated Boolean parameter is passed the specified value. + + + + + Initializes the attribute with the specified parameter value. + + + The condition parameter value. Code after the method will be considered unreachable + by diagnostics if the argument to the associated parameter matches this value. + + + + + Gets the condition parameter value. + + + + + Specifies that an output may be null even if the corresponding type disallows it. + + + + + Specifies that when a method returns , the parameter may be null even if the corresponding type disallows it. + + + + + Initializes the attribute with the specified return value condition. + + The return value condition. If the method returns this value, the associated parameter may be null. + + + + Gets the return value condition. + + + + + Specifies that the method or property will ensure that the listed field and property members have not-null values. + + + + + Initializes the attribute with a field or property member. + + The field or property member that is promised to be not-null. + + + + Initializes the attribute with the list of field and property members. + + The list of field and property members that are promised to be not-null. + + + + Gets field or property member names. + + + + + Specifies that the method or property will ensure that the listed field and property + members have not-null values when returning with the specified return value condition. + + + + + Initializes the attribute with the specified return value condition and a field or property member. + + The return value condition. If the method returns this value, the associated parameter will not be null. + The field or property member that is promised to be not-null. + + + + Initializes the attribute with the specified return value condition and list of field and property members. + + The return value condition. If the method returns this value, the associated parameter will not be null. + The list of field and property members that are promised to be not-null. + + + + Gets the return value condition. + + + + + Gets field or property member names. + + + + + Specifies that an output will not be null even if the corresponding type allows it. + Specifies that an input argument was not null when the call returns. + + + + + Specifies that the output will be non-null if the named parameter is non-null. + + + + + Initializes the attribute with the associated parameter name. + + The associated parameter name. The output will be non-null if the argument to the parameter specified is non-null. + + + + Gets the associated parameter name. + + + + + Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it. + + + + + Initializes the attribute with the specified return value condition. + + The return value condition. If the method returns this value, the associated parameter will not be null. + + + Gets the return value condition. + + + + Specifies that this constructor sets all required members for the current type, + and callers do not need to set any required members themselves. + + + + + Specifies the syntax used in a string. + + + + + Initializes the with the identifier of the syntax used. + + The syntax identifier. + + + Initializes the with the identifier of the syntax used. + The syntax identifier. + Optional arguments associated with the specific syntax employed. + + + Gets the identifier of the syntax used. + + + Optional arguments associated with the specific syntax employed. + + + The syntax identifier for strings containing composite formats for string formatting. + + + The syntax identifier for strings containing date format specifiers. + + + The syntax identifier for strings containing date and time format specifiers. + + + The syntax identifier for strings containing format specifiers. + + + The syntax identifier for strings containing format specifiers. + + + The syntax identifier for strings containing JavaScript Object Notation (JSON). + + + The syntax identifier for strings containing numeric format specifiers. + + + The syntax identifier for strings containing regular expressions. + + + The syntax identifier for strings containing time format specifiers. + + + The syntax identifier for strings containing format specifiers. + + + The syntax identifier for strings containing URIs. + + + The syntax identifier for strings containing XML. + + + + Used to indicate a byref escapes and is not scoped. + + + + There are several cases where the C# compiler treats a as implicitly + - where the compiler does not allow the to escape the method. + + + For example: + + for instance methods. + parameters that refer to types. + parameters. + + + + This attribute is used in those instances where the should be allowed to escape. + + + Applying this attribute, in any form, has impact on consumers of the applicable API. It is necessary for + API authors to understand the lifetime implications of applying this attribute and how it may impact their users. + + + + + + Indicates that certain members on a specified are accessed dynamically, + for example through . + + + This allows tools to understand which members are being accessed during the execution + of a program. + + This attribute is valid on members whose type is or . + + When this attribute is applied to a location of type , the assumption is + that the string represents a fully qualified type name. + + When this attribute is applied to a class, interface, or struct, the members specified + can be accessed dynamically on instances returned from calling + on instances of that class, interface, or struct. + + If the attribute is applied to a method it's treated as a special case and it implies + the attribute should be applied to the "this" parameter of the method. As such the attribute + should only be used on instance methods of types assignable to System.Type (or string, but no methods + will use it there). + + + + + Initializes a new instance of the class + with the specified member types. + + The types of members dynamically accessed. + + + + Gets the which specifies the type + of members dynamically accessed. + + + + + Specifies the types of members that are dynamically accessed. + + This enumeration has a attribute that allows a + bitwise combination of its member values. + + + + + Specifies no members. + + + + + Specifies the default, parameterless public constructor. + + + + + Specifies all public constructors. + + + + + Specifies all non-public constructors. + + + + + Specifies all public methods. + + + + + Specifies all non-public methods. + + + + + Specifies all public fields. + + + + + Specifies all non-public fields. + + + + + Specifies all public nested types. + + + + + Specifies all non-public nested types. + + + + + Specifies all public properties. + + + + + Specifies all non-public properties. + + + + + Specifies all public events. + + + + + Specifies all non-public events. + + + + + Specifies all interfaces implemented by the type. + + + + + Specifies all members. + + + + + States a dependency that one member has on another. + + + This can be used to inform tooling of a dependency that is otherwise not evident purely from + metadata and IL, for example a member relied on via reflection. + + + + + Initializes a new instance of the class + with the specified signature of a member on the same type as the consumer. + + The signature of the member depended on. + + + + Initializes a new instance of the class + with the specified signature of a member on a . + + The signature of the member depended on. + The containing . + + + + Initializes a new instance of the class + with the specified signature of a member on a type in an assembly. + + The signature of the member depended on. + The full name of the type containing the specified member. + The assembly name of the type containing the specified member. + + + + Initializes a new instance of the class + with the specified types of members on a . + + The types of members depended on. + The containing the specified members. + + + + Initializes a new instance of the class + with the specified types of members on a type in an assembly. + + The types of members depended on. + The full name of the type containing the specified members. + The assembly name of the type containing the specified members. + + + + Gets the signature of the member depended on. + + + Either must be a valid string or + must not equal , but not both. + + + + + Gets the which specifies the type + of members depended on. + + + Either must be a valid string or + must not equal , but not both. + + + + + Gets the containing the specified member. + + + If neither nor are specified, + the type of the consumer is assumed. + + + + + Gets the full name of the type containing the specified member. + + + If neither nor are specified, + the type of the consumer is assumed. + + + + + Gets the assembly name of the specified type. + + + is only valid when is specified. + + + + + Gets or sets the condition in which the dependency is applicable, e.g. "DEBUG". + + + + + Indicates that the specified method requires the ability to generate new code at runtime, + for example through . + + + This allows tools to understand which methods are unsafe to call when compiling ahead of time. + + + + + Initializes a new instance of the class + with the specified message. + + + A message that contains information about the usage of dynamic code. + + + + + Gets a message that contains information about the usage of dynamic code. + + + + + Gets or sets an optional URL that contains more information about the method, + why it requires dynamic code, and what options a consumer has to deal with it. + + + + + Indicates that the specified method requires dynamic access to code that is not referenced + statically, for example through . + + + This allows tools to understand which methods are unsafe to call when removing unreferenced + code from an application. + + + + + Initializes a new instance of the class + with the specified message. + + + A message that contains information about the usage of unreferenced code. + + + + + Gets a message that contains information about the usage of unreferenced code. + + + + + Gets or sets an optional URL that contains more information about the method, + why it requires unreferenced code, and what options a consumer has to deal with it. + + + + + Suppresses reporting of a specific rule violation, allowing multiple suppressions on a + single code artifact. + + + is different than + in that it doesn't have a + . So it is always preserved in the compiled assembly. + + + + + Initializes a new instance of the + class, specifying the category of the tool and the identifier for an analysis rule. + + The category for the attribute. + The identifier of the analysis rule the attribute applies to. + + + + Gets the category identifying the classification of the attribute. + + + The property describes the tool or tool analysis category + for which a message suppression attribute applies. + + + + + Gets the identifier of the analysis tool rule to be suppressed. + + + Concatenated together, the and + properties form a unique check identifier. + + + + + Gets or sets the scope of the code that is relevant for the attribute. + + + The Scope property is an optional argument that specifies the metadata scope for which + the attribute is relevant. + + + + + Gets or sets a fully qualified path that represents the target of the attribute. + + + The property is an optional argument identifying the analysis target + of the attribute. An example value is "System.IO.Stream.ctor():System.Void". + Because it is fully qualified, it can be long, particularly for targets such as parameters. + The analysis tool user interface should be capable of automatically formatting the parameter. + + + + + Gets or sets an optional argument expanding on exclusion criteria. + + + The property is an optional argument that specifies additional + exclusion where the literal metadata target is not sufficiently precise. For example, + the cannot be applied within a method, + and it may be desirable to suppress a violation against a statement in the method that will + give a rule violation, but not against all statements in the method. + + + + + Gets or sets the justification for suppressing the code analysis message. + + + + + Types and Methods attributed with StackTraceHidden will be omitted from the stack trace text shown in StackTrace.ToString() + and Exception.StackTrace + + + + + Initializes a new instance of the class. + + + + Represent a type can be used to index a collection either from the start or the end. + + Index is used by the C# compiler to support the new index syntax + + int[] someArray = new int[5] { 1, 2, 3, 4, 5 } ; + int lastElement = someArray[^1]; // lastElement = 5 + + + + + Construct an Index using a value and indicating if the index is from the start or from the end. + The index value. it has to be zero or positive number. + Indicating if the index is from the start or from the end. + + If the Index constructed from the end, index value 1 means pointing at the last element and index value 0 means pointing at beyond last element. + + + + Create an Index pointing at first element. + + + Create an Index pointing at beyond last element. + + + Create an Index from the start at the position indicated by the value. + The index value from the start. + + + Create an Index from the end at the position indicated by the value. + The index value from the end. + + + Returns the index value. + + + Indicates whether the index is from the start or the end. + + + Calculate the offset from the start using the giving collection length. + The length of the collection that the Index will be used with. length has to be a positive value + + For performance reason, we don't validate the input length parameter and the returned offset value against negative values. + we don't validate either the returned offset is greater than the input length. + It is expected Index will be used with collections which always have non negative length/count. If the returned offset is negative and + then used to index a collection will get out of range exception which will be same affect as the validation. + + + + Indicates whether the current Index object is equal to another object of the same type. + An object to compare with this object + + + Indicates whether the current Index object is equal to another Index object. + An object to compare with this object + + + Returns the hash code for this instance. + + + Converts integer number to an Index. + + + Converts the value of the current Index object to its equivalent string representation. + + + Represent a range has start and end indexes. + + Range is used by the C# compiler to support the range syntax. + + int[] someArray = new int[5] { 1, 2, 3, 4, 5 }; + int[] subArray1 = someArray[0..2]; // { 1, 2 } + int[] subArray2 = someArray[1..^0]; // { 2, 3, 4, 5 } + + + + + Represent the inclusive start index of the Range. + + + Represent the exclusive end index of the Range. + + + Construct a Range object using the start and end indexes. + Represent the inclusive start index of the range. + Represent the exclusive end index of the range. + + + Indicates whether the current Range object is equal to another object of the same type. + An object to compare with this object + + + Indicates whether the current Range object is equal to another Range object. + An object to compare with this object + + + Returns the hash code for this instance. + + + Converts the value of the current Range object to its equivalent string representation. + + + Create a Range object starting from start index to the end of the collection. + + + Create a Range object starting from first element in the collection to the end Index. + + + Create a Range object starting from first element to the end. + + + Calculate the start offset and length of range object using a collection length. + The length of the collection that the range will be used with. length has to be a positive value. + + For performance reason, we don't validate the input length parameter against negative values. + It is expected Range will be used with collections which always have non negative length/count. + We validate the range is inside the length scope though. + + + + + Indicates the type of the async method builder that should be used by a language compiler to + build the attributed async method or to build the attributed type when used as the return type + of an async method. + + + + Initializes the . + The of the associated builder. + + + Gets the of the associated builder. + + + + An attribute that allows parameters to receive the expression of other parameters. + + + + + Initializes a new instance of the class. + + The condition parameter value. + + + + Gets the parameter name the expression is retrieved from. + + + + + Indicates that compiler support for a particular feature is required for the location where this attribute is applied. + + + + + Creates a new instance of the type. + + The name of the feature to indicate. + + + + The name of the compiler feature. + + + + + If true, the compiler can choose to allow access to the location where this attribute is applied if it does not understand . + + + + + The used for the ref structs C# feature. + + + + + The used for the required members C# feature. + + + + + Indicates which arguments to a method involving an interpolated string handler should be passed to that handler. + + + + + Initializes a new instance of the class. + + The name of the argument that should be passed to the handler. + may be used as the name of the receiver in an instance method. + + + + Initializes a new instance of the class. + + The names of the arguments that should be passed to the handler. + may be used as the name of the receiver in an instance method. + + + + Gets the names of the arguments that should be passed to the handler. + + may be used as the name of the receiver in an instance method. + + + + Indicates the attributed type is to be used as an interpolated string handler. + + + + + Reserved to be used by the compiler for tracking metadata. + This class should not be used by developers in source code. + + + + + Used to indicate to the compiler that a method should be called + in its containing module's initializer. + + + When one or more valid methods + with this attribute are found in a compilation, the compiler will + emit a module initializer which calls each of the attributed methods. + + Certain requirements are imposed on any method targeted with this attribute: + - The method must be `static`. + - The method must be an ordinary member method, as opposed to a property accessor, constructor, local function, etc. + - The method must be parameterless. + - The method must return `void`. + - The method must not be generic or be contained in a generic type. + - The method's effective accessibility must be `internal` or `public`. + + The specification for module initializers in the .NET runtime can be found here: + https://github.com/dotnet/runtime/blob/main/docs/design/specs/Ecma-335-Augments.md#module-initializer + + + + + Specifies that a type has required members or that a member is required. + + + + + Used to indicate to the compiler that the .locals init flag should not be set in method headers. + + + + + Disables the built-in runtime managed/unmanaged marshalling subsystem for + P/Invokes, Delegate types, and unmanaged function pointer invocations. + + + The built-in marshalling subsystem has some behaviors that cannot be changed due to + backward-compatibility requirements. This attribute allows disabling the built-in + subsystem and instead uses the following rules for P/Invokes, Delegates, + and unmanaged function pointer invocations: + + - All value types that do not contain reference type fields recursively (unmanaged in C#) are blittable + - Value types that recursively have any fields that have [StructLayout(LayoutKind.Auto)] are disallowed from interop. + - All reference types are disallowed from usage in interop scenarios. + - SetLastError support in P/Invokes is disabled. + - varargs support is disabled. + - LCIDConversionAttribute support is disabled. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified message. + + An optional message associated with this attribute instance. + + + + Returns the optional message associated with this attribute instance. + + + + + Returns the optional URL associated with this attribute instance. + + + + + Marks APIs that were obsoleted in a given operating system version. + + + Primarily used by OS bindings to indicate APIs that should not be used anymore. + + + + + Records the operating system (and minimum version) that supports an API. Multiple attributes can be + applied to indicate support on multiple operating systems. + + + Callers can apply a + or use guards to prevent calls to APIs on unsupported operating systems. + + A given platform should only be specified once. + + + + + Annotates a custom guard field, property or method with a supported platform name and optional version. + Multiple attributes can be applied to indicate guard for multiple supported platforms. + + + Callers can apply a to a field, property or method + and use that field, property or method in a conditional or assert statements in order to safely call platform specific APIs. + + The type of the field or property should be boolean, the method return type should be boolean in order to be used as platform guard. + + + + + Records the platform that the project targeted. + + + + + Marks APIs that were removed in a given operating system version. + + + Primarily used by OS bindings to indicate APIs that are only available in + earlier versions. + + + + + Annotates the custom guard field, property or method with an unsupported platform name and optional version. + Multiple attributes can be applied to indicate guard for multiple unsupported platforms. + + + Callers can apply a to a field, property or method + and use that field, property or method in a conditional or assert statements as a guard to safely call APIs unsupported on those platforms. + + The type of the field or property should be boolean, the method return type should be boolean in order to be used as platform guard. + + + + + An attribute used to indicate a GC transition should be skipped when making an unmanaged function call. + + + Example of a valid use case. The Win32 `GetTickCount()` function is a small performance related function + that reads some global memory and returns the value. In this case, the GC transition overhead is significantly + more than the memory read. + + using System; + using System.Runtime.InteropServices; + class Program + { + [DllImport("Kernel32")] + [SuppressGCTransition] + static extern int GetTickCount(); + static void Main() + { + Console.WriteLine($"{GetTickCount()}"); + } + } + + + + This attribute is ignored if applied to a method without the . + + Forgoing this transition can yield benefits when the cost of the transition is more than the execution time + of the unmanaged function. However, avoiding this transition removes some of the guarantees the runtime + provides through a normal P/Invoke. When exiting the managed runtime to enter an unmanaged function the + GC must transition from Cooperative mode into Preemptive mode. Full details on these modes can be found at + https://github.com/dotnet/runtime/blob/main/docs/coding-guidelines/clr-code-guide.md#2.1.8. + Suppressing the GC transition is an advanced scenario and should not be done without fully understanding + potential consequences. + + One of these consequences is an impact to Mixed-mode debugging (https://docs.microsoft.com/visualstudio/debugger/how-to-debug-in-mixed-mode). + During Mixed-mode debugging, it is not possible to step into or set breakpoints in a P/Invoke that + has been marked with this attribute. A workaround is to switch to native debugging and set a breakpoint in the native function. + In general, usage of this attribute is not recommended if debugging the P/Invoke is important, for example + stepping through the native code or diagnosing an exception thrown from the native code. + + The runtime may load the native library for method marked with this attribute in advance before the method is called for the first time. + Usage of this attribute is not recommended for platform neutral libraries with conditional platform specific code. + + The P/Invoke method that this attribute is applied to must have all of the following properties: + * Native function always executes for a trivial amount of time (less than 1 microsecond). + * Native function does not perform a blocking syscall (e.g. any type of I/O). + * Native function does not call back into the runtime (e.g. Reverse P/Invoke). + * Native function does not throw exceptions. + * Native function does not manipulate locks or other concurrency primitives. + + Consequences of invalid uses of this attribute: + * GC starvation. + * Immediate runtime termination. + * Data corruption. + + + + + Any method marked with can be directly called from + native code. The function token can be loaded to a local variable using the address-of operator + in C# and passed as a callback to a native method. + + + Methods marked with this attribute have the following restrictions: + * Method must be marked "static". + * Must not be called from managed code. + * Must only have blittable arguments. + + + + + Optional. If omitted, the runtime will use the default platform calling convention. + + + Supplied types must be from the official "System.Runtime.CompilerServices" namespace and + be of the form "CallConvXXX". + + + + + Optional. If omitted, no named export is emitted during compilation. + + + + diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.xml.meta b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.xml.meta new file mode 100644 index 00000000..9b90ae18 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.Serilog.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3e94bd89ee802f843885cd8b2cf8a31c +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.SynchronizerModel.deps.json b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.SynchronizerModel.deps.json new file mode 100644 index 00000000..ff17d91c --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.SynchronizerModel.deps.json @@ -0,0 +1,47 @@ +{ + "runtimeTarget": { + "name": ".NETStandard,Version=v2.0/", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETStandard,Version=v2.0": {}, + ".NETStandard,Version=v2.0/": { + "Meryel.UnityCodeAssist.SynchronizerModel/1.1.12": { + "dependencies": { + "NETStandard.Library": "2.0.3" + }, + "runtime": { + "Meryel.UnityCodeAssist.SynchronizerModel.dll": {} + } + }, + "Microsoft.NETCore.Platforms/1.1.0": {}, + "NETStandard.Library/2.0.3": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + } + } + }, + "libraries": { + "Meryel.UnityCodeAssist.SynchronizerModel/1.1.12": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Microsoft.NETCore.Platforms/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", + "path": "microsoft.netcore.platforms/1.1.0", + "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" + }, + "NETStandard.Library/2.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "path": "netstandard.library/2.0.3", + "hashPath": "netstandard.library.2.0.3.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.SynchronizerModel.deps.json.meta b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.SynchronizerModel.deps.json.meta new file mode 100644 index 00000000..537b1444 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.SynchronizerModel.deps.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6e83d5c4d41bade419ab9c0bcaf0632d +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.SynchronizerModel.dll b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.SynchronizerModel.dll new file mode 100644 index 0000000000000000000000000000000000000000..62c76252e06783fd3c9d977363fbb5f098212e9b GIT binary patch literal 18432 zcmeHPdw5jknSaljYbME%Nw|l=KmsBIAt3~fA|xas1PMeE5N#}(WDd#5WM-V1Ai>p! zB5J)=t!=eyT`p>MtyR~y>u#+ZS8CNqx3+8d=~H_Fp{={NPwUpLwNJP1?|sjAX3ped zZJ+LL|L6(d@4UC~``+(iIlgVA&_nMw?#!b8FSa6F#K1pAC&YB(N@#)B=}x`IQAh*4c!?5k2qceWC3(Hyko z&13gixt*j%!9uNuXdNV8Q~IqQyn_h62t*}9>!#l(B@ZVVrfKJM){01ja z5MEWM(y4xM;#)5WH$o$V?P-LhI%UKXFl1k86oJ#)h+umfi8k0+As^>@#lybo(eYB>JEnSvE2nbL$rlk-Ncr1Ys5TG-e7DCw4DzFqnz|v<4gn*#X5(r_7 ziW)c56atpTmOuyy{FXon2v9?26d@o$kxYRQ5CklN5D=7F0wEwMvjjpwFx?UeVRH}- zU?whvO)=9_2!SMKSpp$)mf0$wZ5arWGq`Gwr4Ry1&9wwV*euH}g%GfuX9=fe<;%Y=IV820~Z{YxJwuL*YoE%Z8R^IdstwcVO;-=%8$} ztgJ?-x1fM!z>xwbm!iph%gc4=QuN@E&)x8CsLcf32}~jGWsVd~Yc1&NDIJ4_HN-}&$lqasx13^*I= zvX%j7VwY+9@jO$Emr$82;A-&ZOkIgfOw;3erWiq?GIzk;@O{*VS?+*4aj9wgLY^tc zR;bJq@HG5g&eW5@Ov`n2D$f+7E>z|XcpI+InR*kLyx8>JJX4IrP+38sprI#cT9CNR zG_BO^HGmNsD)R+=4YfH_U*f~2X+xeV#%`#rFi_aw&Y2b_cAKU<@=P(RLuEyQqK4Nn zf2tZNO7xnhSLB(ZD}~C61H}!G98S6hgrALQ5b71Y0bD5D;`&0wEySY6*nMC2q|x`R}qCCm|_bngc=C z4A%^wyKrVvXob7H&%I0cCeUoYu+OU}&@R4NmsD4H%KJP}%-UtD3ca&;6)E+q7u}wq zanr8LF5M+_5Sj@49SZ16Z$-;2h+H=NQeSY(HqfkhP#yG`XQ0QxcKh73b`_=ybV|B! z#$2y)3;Trkd)0XJ)`sKR1M9i2h<@Z{IVywB zb-(O$)ANFL9;RP+wfo9QFJ$ck_w^n(&Gifxxan3mB+%``sYz`DL zzUX4SyO{A2N#8?E&naNMNG!h~s6o!&n7&DEYbEqq*UX{@_zzFP{R-(b$MsV}8a!

qzQh&t(Z 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 KxblBi1OEdCDuEgR literal 0 HcmV?d00001 diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.SynchronizerModel.dll.meta b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.SynchronizerModel.dll.meta new file mode 100644 index 00000000..9ee03e19 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.SynchronizerModel.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 04630e77a9218d742bd329fe6df43876 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.deps.json b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.deps.json new file mode 100644 index 00000000..5557e3e2 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.deps.json @@ -0,0 +1,507 @@ +{ + "runtimeTarget": { + "name": ".NETStandard,Version=v2.0/", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETStandard,Version=v2.0": {}, + ".NETStandard,Version=v2.0/": { + "Meryel.UnityCodeAssist.YamlDotNet/1.0.0": { + "dependencies": { + "NETStandard.Library": "2.0.3", + "Nullable": "1.3.1", + "System.ComponentModel.TypeConverter": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Runtime.Serialization.Formatters": "4.3.0" + }, + "runtime": { + "Meryel.UnityCodeAssist.YamlDotNet.dll": {} + } + }, + "Microsoft.NETCore.Platforms/1.1.0": {}, + "Microsoft.NETCore.Targets/1.1.0": {}, + "NETStandard.Library/2.0.3": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + } + }, + "Nullable/1.3.1": {}, + "System.Collections/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.NonGeneric/4.3.0": { + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + }, + "runtime": { + "lib/netstandard1.3/System.Collections.NonGeneric.dll": { + "assemblyVersion": "4.0.2.0", + "fileVersion": "4.6.24705.1" + } + } + }, + "System.Collections.Specialized/4.3.0": { + "dependencies": { + "System.Collections.NonGeneric": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Extensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + }, + "runtime": { + "lib/netstandard1.3/System.Collections.Specialized.dll": { + "assemblyVersion": "4.0.2.0", + "fileVersion": "4.6.24705.1" + } + } + }, + "System.ComponentModel/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + }, + "runtime": { + "lib/netstandard1.3/System.ComponentModel.dll": { + "assemblyVersion": "4.0.2.0", + "fileVersion": "4.6.24705.1" + } + } + }, + "System.ComponentModel.Primitives/4.3.0": { + "dependencies": { + "System.ComponentModel": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + }, + "runtime": { + "lib/netstandard1.0/System.ComponentModel.Primitives.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.24705.1" + } + } + }, + "System.ComponentModel.TypeConverter/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Collections.NonGeneric": "4.3.0", + "System.Collections.Specialized": "4.3.0", + "System.ComponentModel": "4.3.0", + "System.ComponentModel.Primitives": "4.3.0", + "System.Globalization": "4.3.0", + "System.Linq": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + }, + "runtime": { + "lib/netstandard1.5/System.ComponentModel.TypeConverter.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.24705.1" + } + } + }, + "System.Diagnostics.Debug/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.IO/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Linq/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + }, + "runtime": { + "lib/netstandard1.6/System.Linq.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.24705.1" + } + } + }, + "System.Reflection/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Primitives/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions/4.3.0": { + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + }, + "runtime": { + "lib/netstandard1.5/System.Reflection.TypeExtensions.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.24705.1" + } + } + }, + "System.Resources.ResourceManager/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0" + } + }, + "System.Runtime.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.Serialization.Formatters/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Serialization.Primitives": "4.3.0" + }, + "runtime": { + "lib/netstandard1.4/System.Runtime.Serialization.Formatters.dll": { + "assemblyVersion": "4.0.1.0", + "fileVersion": "4.6.24705.1" + } + } + }, + "System.Runtime.Serialization.Primitives/4.3.0": { + "dependencies": { + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + }, + "runtime": { + "lib/netstandard1.3/System.Runtime.Serialization.Primitives.dll": { + "assemblyVersion": "4.1.2.0", + "fileVersion": "4.6.24705.1" + } + } + }, + "System.Text.Encoding/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + }, + "runtime": { + "lib/netstandard1.3/System.Threading.dll": { + "assemblyVersion": "4.0.12.0", + "fileVersion": "4.6.24705.1" + } + } + }, + "System.Threading.Tasks/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0", + "Microsoft.NETCore.Targets": "1.1.0", + "System.Runtime": "4.3.0" + } + } + } + }, + "libraries": { + "Meryel.UnityCodeAssist.YamlDotNet/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Microsoft.NETCore.Platforms/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==", + "path": "microsoft.netcore.platforms/1.1.0", + "hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512" + }, + "Microsoft.NETCore.Targets/1.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==", + "path": "microsoft.netcore.targets/1.1.0", + "hashPath": "microsoft.netcore.targets.1.1.0.nupkg.sha512" + }, + "NETStandard.Library/2.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "path": "netstandard.library/2.0.3", + "hashPath": "netstandard.library.2.0.3.nupkg.sha512" + }, + "Nullable/1.3.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Mk4ZVDfAORTjvckQprCSehi1XgOAAlk5ez06Va/acRYEloN9t6d6zpzJRn5MEq7+RnagyFIq9r+kbWzLGd+6QA==", + "path": "nullable/1.3.1", + "hashPath": "nullable.1.3.1.nupkg.sha512" + }, + "System.Collections/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "path": "system.collections/4.3.0", + "hashPath": "system.collections.4.3.0.nupkg.sha512" + }, + "System.Collections.NonGeneric/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-prtjIEMhGUnQq6RnPEYLpFt8AtLbp9yq2zxOSrY7KJJZrw25Fi97IzBqY7iqssbM61Ek5b8f3MG/sG1N2sN5KA==", + "path": "system.collections.nongeneric/4.3.0", + "hashPath": "system.collections.nongeneric.4.3.0.nupkg.sha512" + }, + "System.Collections.Specialized/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Epx8PoVZR0iuOnJJDzp7pWvdfMMOAvpUo95pC4ScH2mJuXkKA2Y4aR3cG9qt2klHgSons1WFh4kcGW7cSXvrxg==", + "path": "system.collections.specialized/4.3.0", + "hashPath": "system.collections.specialized.4.3.0.nupkg.sha512" + }, + "System.ComponentModel/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VyGn1jGRZVfxnh8EdvDCi71v3bMXrsu8aYJOwoV7SNDLVhiEqwP86pPMyRGsDsxhXAm2b3o9OIqeETfN5qfezw==", + "path": "system.componentmodel/4.3.0", + "hashPath": "system.componentmodel.4.3.0.nupkg.sha512" + }, + "System.ComponentModel.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-j8GUkCpM8V4d4vhLIIoBLGey2Z5bCkMVNjEZseyAlm4n5arcsJOeI3zkUP+zvZgzsbLTYh4lYeP/ZD/gdIAPrw==", + "path": "system.componentmodel.primitives/4.3.0", + "hashPath": "system.componentmodel.primitives.4.3.0.nupkg.sha512" + }, + "System.ComponentModel.TypeConverter/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-16pQ6P+EdhcXzPiEK4kbA953Fu0MNG2ovxTZU81/qsCd1zPRsKc3uif5NgvllCY598k6bI0KUyKW8fanlfaDQg==", + "path": "system.componentmodel.typeconverter/4.3.0", + "hashPath": "system.componentmodel.typeconverter.4.3.0.nupkg.sha512" + }, + "System.Diagnostics.Debug/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "path": "system.diagnostics.debug/4.3.0", + "hashPath": "system.diagnostics.debug.4.3.0.nupkg.sha512" + }, + "System.Globalization/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "path": "system.globalization/4.3.0", + "hashPath": "system.globalization.4.3.0.nupkg.sha512" + }, + "System.Globalization.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==", + "path": "system.globalization.extensions/4.3.0", + "hashPath": "system.globalization.extensions.4.3.0.nupkg.sha512" + }, + "System.IO/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "path": "system.io/4.3.0", + "hashPath": "system.io.4.3.0.nupkg.sha512" + }, + "System.Linq/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "path": "system.linq/4.3.0", + "hashPath": "system.linq.4.3.0.nupkg.sha512" + }, + "System.Reflection/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "path": "system.reflection/4.3.0", + "hashPath": "system.reflection.4.3.0.nupkg.sha512" + }, + "System.Reflection.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "path": "system.reflection.extensions/4.3.0", + "hashPath": "system.reflection.extensions.4.3.0.nupkg.sha512" + }, + "System.Reflection.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "path": "system.reflection.primitives/4.3.0", + "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512" + }, + "System.Reflection.TypeExtensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "path": "system.reflection.typeextensions/4.3.0", + "hashPath": "system.reflection.typeextensions.4.3.0.nupkg.sha512" + }, + "System.Resources.ResourceManager/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "path": "system.resources.resourcemanager/4.3.0", + "hashPath": "system.resources.resourcemanager.4.3.0.nupkg.sha512" + }, + "System.Runtime/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "path": "system.runtime/4.3.0", + "hashPath": "system.runtime.4.3.0.nupkg.sha512" + }, + "System.Runtime.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "path": "system.runtime.extensions/4.3.0", + "hashPath": "system.runtime.extensions.4.3.0.nupkg.sha512" + }, + "System.Runtime.Handles/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "path": "system.runtime.handles/4.3.0", + "hashPath": "system.runtime.handles.4.3.0.nupkg.sha512" + }, + "System.Runtime.InteropServices/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "path": "system.runtime.interopservices/4.3.0", + "hashPath": "system.runtime.interopservices.4.3.0.nupkg.sha512" + }, + "System.Runtime.Serialization.Formatters/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-IfJxJOaVssiaLVmQqRy7GEvkwtQoYvNdVp+cTpRJTadzllivaLaX0Y0yVTRiP5Yp5kIijuuXdB5hMujpwduYcg==", + "path": "system.runtime.serialization.formatters/4.3.0", + "hashPath": "system.runtime.serialization.formatters.4.3.0.nupkg.sha512" + }, + "System.Runtime.Serialization.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-w6fBfup0Yq7bTpY7J6iGR150eTXGiYUGF2E/4DPyv9i3nGpVPIEzbP4w4CcFnADZGQvDSVtzHGXa3Oa5/bj48Q==", + "path": "system.runtime.serialization.primitives/4.3.0", + "hashPath": "system.runtime.serialization.primitives.4.3.0.nupkg.sha512" + }, + "System.Text.Encoding/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "path": "system.text.encoding/4.3.0", + "hashPath": "system.text.encoding.4.3.0.nupkg.sha512" + }, + "System.Threading/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "path": "system.threading/4.3.0", + "hashPath": "system.threading.4.3.0.nupkg.sha512" + }, + "System.Threading.Tasks/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "path": "system.threading.tasks/4.3.0", + "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.deps.json.meta b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.deps.json.meta new file mode 100644 index 00000000..28a6dd43 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.deps.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 81a97117ecce3604d92cfcf429c99b1e +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.dll b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.dll new file mode 100644 index 0000000000000000000000000000000000000000..b45dc8514085330c958178f923d8b1ccd940479b GIT binary patch literal 275968 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�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 z�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 R#S35i1km~^i61)${tfjk + + + Meryel.UnityCodeAssist.YamlDotNet + + + +

+ The exception that is thrown when an alias references an anchor that does not exist. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + The inner. + + + + Defines constants that relate to the YAML specification. + + + + + Emits YAML streams. + + + + + Initializes a new instance of the class. + + The where the emitter will write. + + + + Initializes a new instance of the class. + + The where the emitter will write. + The preferred indentation. + + + + Initializes a new instance of the class. + + The where the emitter will write. + The preferred indentation. + The preferred text width. + + + + Initializes a new instance of the class. + + The where the emitter will write. + The preferred indentation. + The preferred text width. + If true, write the output in canonical form. + + + + Emit an evt. + + + + + Check if we need to accumulate more events before emitting. + + We accumulate extra + - 1 event for DOCUMENT-START + - 2 events for SEQUENCE-START + - 3 events for MAPPING-START + + + + + Expect STREAM-START. + + + + + Expect DOCUMENT-START or STREAM-END. + + + + + Expect the root node. + + + + + Expect a node. + + + + + Expect ALIAS. + + + + + Expect SCALAR. + + + + + Expect SEQUENCE-START. + + + + + Expect MAPPING-START. + + + + + Expect DOCUMENT-END. + + + + + Expect a flow item node. + + + + + Expect a flow key node. + + + + + Expect a flow value node. + + + + + Expect a block item node. + + + + + Expect a block key node. + + + + + Expect a block value node. + + + + + Check if the document content is an empty scalar. + + + + + Check if the next node can be expressed as a simple key. + + + + + The preferred indentation. + + + + + The preferred text width. + + + + + New line characters. + + + + + If true, write the output in canonical form. + + + + + If true, write output without anchor names. + + + + + The maximum allowed length for simple keys. + + + The specifiction mandates 1024 characters, but any desired value may be used. + + + + + Indent sequences. The default is to not indent. + + + + + Represents an alias event. + + + + + Gets the event type, which allows for simpler type comparisons. + + + + + Gets the value of the alias. + + + + + Initializes a new instance of the class. + + The value of the alias. + The start position of the event. + The end position of the event. + + + + Initializes a new instance of the class. + + The value of the alias. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Invokes run-time type specific Visit() method of the specified visitor. + + visitor, may not be null. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Represents a document end event. + + + + + Gets a value indicating the variation of depth caused by this event. + The value can be either -1, 0 or 1. For start events, it will be 1, + for end events, it will be -1, and for the remaining events, it will be 0. + + + + + Gets the event type, which allows for simpler type comparisons. + + + + + Gets a value indicating whether this instance is implicit. + + + true if this instance is implicit; otherwise, false. + + + + + Initializes a new instance of the class. + + Indicates whether the event is implicit. + The start position of the event. + The end position of the event. + + + + Initializes a new instance of the class. + + Indicates whether the event is implicit. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Invokes run-time type specific Visit() method of the specified visitor. + + visitor, may not be null. + + + + Represents a document start event. + + + + + Gets a value indicating the variation of depth caused by this event. + The value can be either -1, 0 or 1. For start events, it will be 1, + for end events, it will be -1, and for the remaining events, it will be 0. + + + + + Gets the event type, which allows for simpler type comparisons. + + + + + Gets the tags. + + The tags. + + + + Gets the version. + + The version. + + + + Gets a value indicating whether this instance is implicit. + + + true if this instance is implicit; otherwise, false. + + + + + Initializes a new instance of the class. + + The version. + The tags. + Indicates whether the event is implicit. + The start position of the event. + The end position of the event. + + + + Initializes a new instance of the class. + + The version. + The tags. + Indicates whether the event is implicit. + + + + Initializes a new instance of the class. + + The start position of the event. + The end position of the event. + + + + Initializes a new instance of the class. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Invokes run-time type specific Visit() method of the specified visitor. + + visitor, may not be null. + + + + Callback interface for external event Visitor. + + + + + Represents a mapping end event. + + + + + Gets a value indicating the variation of depth caused by this event. + The value can be either -1, 0 or 1. For start events, it will be 1, + for end events, it will be -1, and for the remaining events, it will be 0. + + + + + Gets the event type, which allows for simpler type comparisons. + + + + + Initializes a new instance of the class. + + The start position of the event. + The end position of the event. + + + + Initializes a new instance of the class. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Invokes run-time type specific Visit() method of the specified visitor. + + visitor, may not be null. + + + + Represents a mapping start event. + + + + + Gets a value indicating the variation of depth caused by this event. + The value can be either -1, 0 or 1. For start events, it will be 1, + for end events, it will be -1, and for the remaining events, it will be 0. + + + + + Gets the event type, which allows for simpler type comparisons. + + + + + Gets a value indicating whether this instance is implicit. + + + true if this instance is implicit; otherwise, false. + + + + + Gets a value indicating whether this instance is canonical. + + + + + + Gets the style of the mapping. + + + + + Initializes a new instance of the class. + + The anchor. + The tag. + Indicates whether the event is implicit. + The style of the mapping. + The start position of the event. + The end position of the event. + + + + Initializes a new instance of the class. + + The anchor. + The tag. + Indicates whether the event is implicit. + The style of the mapping. + + + + Initializes a new instance of the class. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Invokes run-time type specific Visit() method of the specified visitor. + + visitor, may not be null. + + + + Specifies the style of a mapping. + + + + + Let the emitter choose the style. + + + + + The block mapping style. + + + + + The flow mapping style. + + + + + Contains the behavior that is common between node events. + + + + + Gets the anchor. + + + + + + Gets the tag. + + + + + + Gets a value indicating whether this instance is canonical. + + + + + + Initializes a new instance of the class. + + The anchor. + The tag. + The start position of the event. + The end position of the event. + + + + Initializes a new instance of the class. + + + + + Base class for parsing events. + + + + + Gets a value indicating the variation of depth caused by this event. + The value can be either -1, 0 or 1. For start events, it will be 1, + for end events, it will be -1, and for the remaining events, it will be 0. + + + + + Gets the event type, which allows for simpler type comparisons. + + + + + Gets the position in the input stream where the event starts. + + + + + Gets the position in the input stream where the event ends. + + + + + Accepts the specified visitor. + + Visitor to accept, may not be null + + + + Initializes a new instance of the class. + + The start position of the event. + The end position of the event. + + + + Represents a scalar event. + + + + + Gets the event type, which allows for simpler type comparisons. + + + + + Gets the value. + + The value. + + + + Gets the style of the scalar. + + The style. + + + + Gets a value indicating whether the tag is optional for the plain style. + + + + + Gets a value indicating whether the tag is optional for any non-plain style. + + + + + Gets a value indicating whether this instance is canonical. + + + + + + Gets whether this scalar event is a key + + + + + Initializes a new instance of the class. + + The anchor. + The tag. + The value. + The style. + . + . + The start position of the event. + The end position of the event. + Whether or not this scalar event is for a key + + + + Initializes a new instance of the class. + + The anchor. + The tag. + The value. + The style. + . + . + + + + Initializes a new instance of the class. + + The value. + + + + Initializes a new instance of the class. + + The tag. + The value. + + + + Initializes a new instance of the class. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Invokes run-time type specific Visit() method of the specified visitor. + + visitor, may not be null. + + + + Represents a sequence end event. + + + + + Gets a value indicating the variation of depth caused by this event. + The value can be either -1, 0 or 1. For start events, it will be 1, + for end events, it will be -1, and for the remaining events, it will be 0. + + + + + Gets the event type, which allows for simpler type comparisons. + + + + + Initializes a new instance of the class. + + The start position of the event. + The end position of the event. + + + + Initializes a new instance of the class. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Invokes run-time type specific Visit() method of the specified visitor. + + visitor, may not be null. + + + + Represents a sequence start event. + + + + + Gets a value indicating the variation of depth caused by this event. + The value can be either -1, 0 or 1. For start events, it will be 1, + for end events, it will be -1, and for the remaining events, it will be 0. + + + + + Gets the event type, which allows for simpler type comparisons. + + + + + Gets a value indicating whether this instance is implicit. + + + true if this instance is implicit; otherwise, false. + + + + + Gets a value indicating whether this instance is canonical. + + + + + + Gets the style. + + The style. + + + + Initializes a new instance of the class. + + The anchor. + The tag. + if set to true [is implicit]. + The style. + The start position of the event. + The end position of the event. + + + + Initializes a new instance of the class. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Invokes run-time type specific Visit() method of the specified visitor. + + visitor, may not be null. + + + + Specifies the style of a sequence. + + + + + Let the emitter choose the style. + + + + + The block sequence style. + + + + + The flow sequence style. + + + + + Represents a stream end event. + + + + + Gets a value indicating the variation of depth caused by this event. + The value can be either -1, 0 or 1. For start events, it will be 1, + for end events, it will be -1, and for the remaining events, it will be 0. + + + + + Gets the event type, which allows for simpler type comparisons. + + + + + Initializes a new instance of the class. + + The start position of the event. + The end position of the event. + + + + Initializes a new instance of the class. + + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Invokes run-time type specific Visit() method of the specified visitor. + + visitor, may not be null. + + + + Represents a stream start event. + + + + + Gets a value indicating the variation of depth caused by this event. + The value can be either -1, 0 or 1. For start events, it will be 1, + for end events, it will be -1, and for the remaining events, it will be 0. + + + + + Gets the event type, which allows for simpler type comparisons. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The start position of the event. + The end position of the event. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + Invokes run-time type specific Visit() method of the specified visitor. + + visitor, may not be null. + + + + The exception that is thrown when an alias references an anchor + that has not yet been defined in a context that does not support forward references. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + The inner. + + + + Supports implementations of by providing methods to combine two hash codes. + + + + + Combines two hash codes. + + The first hash code. + The second hash code. + + + + + Represents a YAML stream emitter. + + + + + Emits an event. + + + + + Gets a value indicating whether the end of the input reader has been reached. + + + + + Gets the character at the specified offset. + + + + + Skips the next characters. Those characters must have been + obtained first by calling the method. + + + + + Generic queue on which items may be inserted + + + + + Gets the number of items that are contained by the queue. + + + + + Enqueues the specified item. + + The item to be enqueued. + + + + Dequeues an item. + + Returns the item that been dequeued. + + + + Inserts an item at the specified index. + + The index where to insert the item. + The item to be inserted. + + + + Represents a YAML stream parser. + + + + + Gets the current event. Returns null before the first call to , + and also after returns false. + + + + + Moves to the next event. + + Returns true if there are more events available, otherwise returns false. + + + + Defines the interface for a stand-alone YAML scanner that + converts a sequence of characters into a sequence of YAML tokens. + + + + + Gets the current position inside the input stream. + + The current position. + + + + Gets the current token. + + + + + Moves to the next token and consumes the current token. + + + + + Moves to the next token without consuming the current token. + + + + + Consumes the current token. + + + + + Provides access to a stream and allows to peek at the next characters, + up to the buffer's capacity. + + + This class implements a circular buffer with a fixed capacity. + + + + + Initializes a new instance of the class. + + The input. + The capacity. + + + + Gets a value indicating whether the end of the input reader has been reached. + + + + + Gets the index of the character for the specified offset. + + + + + Gets the character at the specified offset. + + + + + Reads characters until at least characters are in the buffer. + + + Number of characters to cache. + + + + + Skips the next characters. Those characters must have been + obtained first by calling the or methods. + + + + + Represents a location inside a file + + + + + Gets a with empty values. + + + + + Gets / sets the absolute offset in the file + + + + + Gets / sets the number of the line + + + + + Gets / sets the index of the column + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + + + + + + + + + + + + + + + + Exception that is thrown when an infinite recursion is detected. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + The inner. + + + + Simple implementation of that implements merging: http://yaml.org/type/merge.html + + + + + Parses YAML streams. + + + + + Initializes a new instance of the class. + + The input where the YAML stream is to be read. + + + + Initializes a new instance of the class. + + + + + Gets the current event. + + + + + Moves to the next event. + + Returns true if there are more events available, otherwise returns false. + + + + Parse the production: + stream ::= STREAM-START implicit_document? explicit_document* STREAM-END + ************ + + + + + Parse the productions: + implicit_document ::= block_node DOCUMENT-END* + * + explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* + ************************* + + + + + Parse directives. + + + + + Parse the productions: + explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* + *********** + + + + + Generate an empty scalar event. + + + + + Parse the productions: + block_node_or_indentless_sequence ::= + ALIAS + ***** + | properties (block_content | indentless_block_sequence)? + ********** * + | block_content | indentless_block_sequence + * + block_node ::= ALIAS + ***** + | properties block_content? + ********** * + | block_content + * + flow_node ::= ALIAS + ***** + | properties flow_content? + ********** * + | flow_content + * + properties ::= TAG ANCHOR? | ANCHOR TAG? + ************************* + block_content ::= block_collection | flow_collection | SCALAR + ****** + flow_content ::= flow_collection | SCALAR + ****** + + + + + Parse the productions: + implicit_document ::= block_node DOCUMENT-END* + ************* + explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END* + ************* + + + + + Parse the productions: + block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END + ******************** *********** * ********* + + + + + Parse the productions: + indentless_sequence ::= (BLOCK-ENTRY block_node?)+ + *********** * + + + + + Parse the productions: + block_mapping ::= BLOCK-MAPPING_START + ******************* + ((KEY block_node_or_indentless_sequence?)? + *** * + (VALUE block_node_or_indentless_sequence?)?)* + + BLOCK-END + ********* + + + + + Parse the productions: + block_mapping ::= BLOCK-MAPPING_START + + ((KEY block_node_or_indentless_sequence?)? + + (VALUE block_node_or_indentless_sequence?)?)* + ***** * + BLOCK-END + + + + + + Parse the productions: + flow_sequence ::= FLOW-SEQUENCE-START + ******************* + (flow_sequence_entry FLOW-ENTRY)* + * ********** + flow_sequence_entry? + * + FLOW-SEQUENCE-END + ***************** + flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + * + + + + + Parse the productions: + flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + *** * + + + + + Parse the productions: + flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + ***** * + + + + + Parse the productions: + flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + * + + + + + Parse the productions: + flow_mapping ::= FLOW-MAPPING-START + ****************** + (flow_mapping_entry FLOW-ENTRY)* + * ********** + flow_mapping_entry? + ****************** + FLOW-MAPPING-END + **************** + flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + * *** * + + + + + Parse the productions: + flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? + * ***** * + + + + + Extension methods that provide useful abstractions over . + + + + + Ensures that the current event is of the specified type, returns it and moves to the next event. + + Type of the . + Returns the current event. + If the current event is not of the specified type. + + + + Checks whether the current event is of the specified type. + If the event is of the specified type, returns it and moves to the next event. + Otherwise returns null. + + Type of the . + Returns true if the current event is of type T; otherwise returns null. + + + + Enforces that the current event is of the specified type. + + Type of the . + Returns the current event. + If the current event is not of the specified type. + + + + Checks whether the current event is of the specified type. + + Type of the event. + Returns true if the current event is of type . Otherwise returns false. + + + + Skips the current event and any nested event. + + + + + Attempts to find a key on a YAML mapping that matches our predicate. + This is useful for scanning a mapping for type discriminator information. + For example: looking for a `kind` key on an object. + + This function only checks mappings, and only looks at the current depth. + + If the event is a mapping and has a key that satisfies the predicate the scan + will stop, return true, and set and + . All events up until the predicate is matched will + be consumed. + + If the event is not a mapping event or a matching key is not found, returns false. + + The IParser which will have its current value checked for a matching mapping entry + The selector to filter the mapping by + The matching key of the mapping as a Scalar, or null if no matching key found + The matching value of the mapping as a ParsingEvent, or null if no matching key found + Returns true if the current event is a mapping entry with a key that matches the selector; + otherwise returns false. + + + + Keeps track of the recursion level, + and throws + whenever is reached. + + + + + Increments the recursion level, + and throws + if is reached. + + + + + Increments the recursion level, + and returns whether is still less than . + + + + + Decrements the recursion level. + + + + + Specifies the style of a YAML scalar. + + + + + Let the emitter choose the style. + + + + + The plain scalar style. + + + + + The single-quoted scalar style. + + + + + The double-quoted scalar style. + + + + + The literal scalar style. + + + + + The folded scalar style. + + + + + Converts a sequence of characters into a sequence of YAML tokens. + + + + + Gets the current token. + + + + + Initializes a new instance of the class. + + The input. + Indicates whether comments should be ignored + + + + Gets the current position inside the input stream. + + The current position. + + + + Moves to the next token. + + + + + + Consumes the current token and increments the parsed token count + + + + + Check the list of potential simple keys and remove the positions that + cannot contain simple keys anymore. + + + + + Pop indentation levels from the indents stack until the current level + becomes less or equal to the column. For each indentation level, append + the BLOCK-END token. + + + + + Produce the STREAM-END token and shut down the scanner. + + + + + Scan a YAML-DIRECTIVE or TAG-DIRECTIVE token. + + Scope: + %YAML 1.1 # a comment \n + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + %TAG !yaml! tag:yaml.org,2002: \n + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + + + + Produce the DOCUMENT-START or DOCUMENT-END token. + + + + + Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token. + + + + + Increase the flow level and resize the simple key list if needed. + + + + + Produce the FLOW-SEQUENCE-END or FLOW-MAPPING-END token. + + + + + Decrease the flow level. + + + + + Produce the FLOW-ENTRY token. + + + + + Produce the BLOCK-ENTRY token. + + + + + Produce the KEY token. + + + + + Produce the VALUE token. + + + + + Push the current indentation level to the stack and set the new level + the current column is greater than the indentation level. In this case, + append or insert the specified token into the token queue. + + + + + Produce the ALIAS or ANCHOR token. + + + + + Produce the TAG token. + + + + + Scan a TAG token. + + + + + Produce the SCALAR(...,literal) or SCALAR(...,folded) tokens. + + + + + Scan a block scalar. + + + + + Scan indentation spaces and line breaks for a block scalar. Determine the + indentation level if needed. + + + + + Produce the SCALAR(...,single-quoted) or SCALAR(...,double-quoted) tokens. + + + + + Scan a quoted scalar. + + + + + Produce the SCALAR(...,plain) token. + + + + + Scan a plain scalar. + + + + + Remove a potential simple key at the current flow level. + + + + + Scan the directive name. + + Scope: + %YAML 1.1 # a comment \n + ^^^^ + %TAG !yaml! tag:yaml.org,2002: \n + ^^^ + + + + + Scan the value of VERSION-DIRECTIVE. + + Scope: + %YAML 1.1 # a comment \n + ^^^^^^ + + + + + Scan the value of a TAG-DIRECTIVE token. + + Scope: + %TAG !yaml! tag:yaml.org,2002: \n + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + + + + Scan a tag. + + + + + Decode an URI-escape sequence corresponding to a single UTF-8 character. + + + + + Scan a tag handle. + + + + + Scan the version number of VERSION-DIRECTIVE. + + Scope: + %YAML 1.1 # a comment \n + ^ + %YAML 1.1 # a comment \n + ^ + + + + + Check if a simple key may start at the current position and add it if + needed. + + + + + Exception that is thrown when a semantic error is detected on a YAML stream. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + The inner. + + + + Exception that is thrown when a syntax error is detected on a YAML stream. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + The inner. + + + + Collection of . + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Initial content of the collection. + + + + + + + Gets a value indicating whether the collection contains a directive with the same handle + + + + + Represents an anchor token. + + + + + Gets the value. + + The value. + + + + Initializes a new instance of the class. + + The value. + + + + Initializes a new instance of the class. + + The value. + The start position of the token. + The end position of the token. + + + + Represents an alias token. + + + + + Gets the value of the alias. + + + + + Initializes a new instance of the class. + + The value of the anchor. + + + + Initializes a new instance of the class. + + The value of the anchor. + The start position of the event. + The end position of the event. + + + + Represents a block end token. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The start position of the token. + The end position of the token. + + + + Represents a block entry event. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The start position of the token. + The end position of the token. + + + + Represents a block mapping start token. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The start position of the token. + The end position of the token. + + + + Represents a block sequence start token. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The start position of the token. + The end position of the token. + + + + Represents a comment + + + + + Gets the value of the comment + + + + + Gets a value indicating whether the comment appears other tokens on that line. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Represents a document end token. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The start position of the token. + The end position of the token. + + + + Represents a document start token. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The start position of the token. + The end position of the token. + + + + Error tokens. + + + + + Gets the value of the error + + + + + Represents a flow entry event. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The start position of the token. + The end position of the token. + + + + Represents a flow mapping end token. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The start position of the token. + The end position of the token. + + + + Represents a flow mapping start token. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The start position of the token. + The end position of the token. + + + + Represents a flow sequence end token. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The start position of the token. + The end position of the token. + + + + Represents a flow sequence start token. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The start position of the token. + The end position of the token. + + + + Represents a key token. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The start position of the token. + The end position of the token. + + + + Represents a scalar token. + + + + + Gets or sets whether this scalar is a key + + + + + Gets the value. + + The value. + + + + Gets the style. + + The style. + + + + Initializes a new instance of the class. + + The value. + + + + Initializes a new instance of the class. + + The value. + The style. + + + + Initializes a new instance of the class. + + The value. + The style. + The start position of the token. + The end position of the token. + + + + Represents a stream end event. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The start position of the token. + The end position of the token. + + + + Represents a stream start token. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The start position of the token. + The end position of the token. + + + + Represents a tag token. + + + + + Gets the handle. + + The handle. + + + + Gets the suffix. + + The suffix. + + + + Initializes a new instance of the class. + + The handle. + The suffix. + + + + Initializes a new instance of the class. + + The handle. + The suffix. + The start position of the token. + The end position of the token. + + + + Represents a tag directive token. + + + + + Gets the handle. + + The handle. + + + + Gets the prefix. + + The prefix. + + + + Initializes a new instance of the class. + + The handle. + The prefix. + + + + Initializes a new instance of the class. + + The handle. + The prefix. + The start position of the token. + The end position of the token. + + + + Determines whether the specified System.Object is equal to the current System.Object. + + The System.Object to compare with the current System.Object. + + true if the specified System.Object is equal to the current System.Object; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + + + + Base class for YAML tokens. + + + + + Gets the start of the token in the input stream. + + + + + Gets the end of the token in the input stream. + + + + + Initializes a new instance of the class. + + The start position of the token. + The end position of the token. + + + + Represents a value token. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The start position of the token. + The end position of the token. + + + + Represents a version directive token. + + + + + Gets the version. + + The version. + + + + Initializes a new instance of the class. + + The version. + + + + Initializes a new instance of the class. + + The version. + The start position of the token. + The end position of the token. + + + + Determines whether the specified System.Object is equal to the current System.Object. + + The System.Object to compare with the current System.Object. + + true if the specified System.Object is equal to the current System.Object; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Specifies the version of the YAML language. + + + + + Gets the major version number. + + + + + Gets the minor version number. + + + + + Initializes a new instance of the class. + + The major version number. + The minor version number. + + + + Determines whether the specified System.Object is equal to the current System.Object. + + The System.Object to compare with the current System.Object. + + true if the specified System.Object is equal to the current System.Object; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Base exception that is thrown when the a problem occurs in the YamlDotNet library. + + + + + Gets the position in the input stream where the event that originated the exception starts. + + + + + Gets the position in the input stream where the event that originated the exception ends. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The message. + The inner. + + + + Generic implementation of object pooling pattern with predefined pool size limit. The main + purpose is that limited number of frequently used objects can be kept in the pool for + further recycling. + + Notes: + 1) it is not the goal to keep all returned objects. Pool is not meant for storage. If there + is no space in the pool, extra returned objects will be dropped. + + 2) it is implied that if object was obtained from a pool, the caller will return it back in + a relatively short time. Keeping checked out objects for long durations is ok, but + reduces usefulness of pooling. Just new up your own. + + Not returning objects to the pool in not detrimental to the pool's work, but is a bad practice. + Rationale: + If there is no intent for reusing the object, do not use pool - just use "new". + + + + + Not using System.Func{T} because this file is linked into the (debugger) Formatter, + which does not have that type (since it compiles against .NET 2.0). + + + + + Produces an instance. + + + Search strategy is a simple linear probing which is chosen for it cache-friendliness. + Note that Free will try to store recycled objects close to the start thus statistically + reducing how far we will typically search. + + + + + Returns objects to the pool. + + + Search strategy is a simple linear probing which is chosen for it cache-friendliness. + Note that Free will try to store recycled objects close to the start thus statistically + reducing how far we will typically search in Allocate. + + + + + Returns the that describes the property that + is being returned in an expression in the form: + + x => x.SomeProperty + + + + + + Adapts an to + because not all generic collections implement . + + + + + Adapts an to + because not all generic dictionaries implement . + + + + + Gets or sets the element with the specified index. + + The index of the element to get or set. + The element with the specified index. + + + + Adds an element with the provided key and value to the + at the given index. + + The zero-based index at which the item should be inserted. + The object to use as the key of the element to add. + The object to use as the value of the element to add. + + + + Removes the element at the specified index. + + The zero-based index of the element to remove. + + + + Pooling of StringBuilder instances. + + + + + Determines whether the specified type has a default constructor. + + The type. + Whether to include private constructors + + true if the type has a default constructor; otherwise, false. + + + + + Manages the state of a while it is loading. + + + + + Adds the specified node to the anchor list. + + The node. + + + + Gets the node with the specified anchor. + + The anchor. + The start position. + The end position. + + if there is no node with that anchor. + + + + Gets the node with the specified anchor. + + The anchor. + The node that was retrieved. + true if the anchor was found; otherwise false. + + + + Adds the specified node to the collection of nodes with unresolved aliases. + + + The that has unresolved aliases. + + + + + Resolves the aliases that could not be resolved while loading the document. + + + + + Holds state that is used when emitting a stream. + + + + + Gets the already emitted anchors. + + The emitted anchors. + + + + Defines the method needed to be able to visit Yaml elements. + + + + + Visits a . + + + The that is being visited. + + + + + Visits a . + + + The that is being visited. + + + + + Visits a . + + + The that is being visited. + + + + + Visits a . + + + The that is being visited. + + + + + Visits a . + + + The that is being visited. + + + + + Represents a LibYAML event stream. + + + + + Initializes a new instance of the class + from the specified . + + + + + Represents an alias node in the YAML document. + + + + + Initializes a new instance of the class. + + The anchor. + + + + Resolves the aliases that could not be resolved when the node was created. + + The state of the document. + + + + Saves the current node to the specified emitter. + + The emitter where the node is to be saved. + The state. + + + + Accepts the specified visitor by calling the appropriate Visit method on it. + + + A . + + + + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Recursively enumerates all the nodes from the document, starting on the current node, + and throwing + if is reached. + + + + + Gets the type of node. + + + + + Represents an YAML document. + + + + + Gets or sets the root node. + + The root node. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a single scalar node. + + + + + Initializes a new instance of the class. + + + + + Visitor that assigns anchors to nodes that are referenced more than once. + Existing anchors are preserved as much as possible. + + + + + Key: Node, Value: IsDuplicate + + + + + Returns whether the visited node is a duplicate. + + + + + Accepts the specified visitor by calling the appropriate Visit method on it. + + + A . + + + + + Gets all nodes from the document. + is thrown if an infinite recursion is detected. + + + + + Represents a mapping node in the YAML document. + + + + + Gets the children of the current node. + + The children. + + + + Gets or sets the style of the node. + + The style. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + A sequence of where even elements are keys and odd elements are values. + + + + Initializes a new instance of the class. + + A sequence of where even elements are keys and odd elements are values. + + + + Adds the specified mapping to the collection. + + The key node. + The value node. + + + + Adds the specified mapping to the collection. + + The key node. + The value node. + + + + Adds the specified mapping to the collection. + + The key node. + The value node. + + + + Adds the specified mapping to the collection. + + The key node. + The value node. + + + + Resolves the aliases that could not be resolved when the node was created. + + The state of the document. + + + + Saves the current node to the specified emitter. + + The emitter where the node is to be saved. + The state. + + + + Accepts the specified visitor by calling the appropriate Visit method on it. + + + A . + + + + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Recursively enumerates all the nodes from the document, starting on the current node, + and throwing + if is reached. + + + + + Gets the type of node. + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + + + + Creates a containing a key-value pair for each property of the specified object. + + + + + Represents a single node in the YAML document. + + + + + Gets or sets the anchor of the node. + + The anchor. + + + + Gets or sets the tag of the node. + + The tag. + + + + Gets the position in the input stream where the event that originated the node starts. + + + + + Gets the position in the input stream where the event that originated the node ends. + + + + + Loads the specified event. + + The event. + The state of the document. + + + + Parses the node represented by the next event in . + + Returns the node that has been parsed. + + + + Resolves the aliases that could not be resolved when the node was created. + + The state of the document. + + + + Saves the current node to the specified emitter. + + The emitter where the node is to be saved. + The state. + + + + Saves the current node to the specified emitter. + + The emitter where the node is to be saved. + The state. + + + + Accepts the specified visitor by calling the appropriate Visit method on it. + + + A . + + + + + Gets all nodes from the document, starting on the current node. + is thrown if an infinite recursion is detected. + + + + + When implemented, recursively enumerates all the nodes from the document, starting on the current node. + If is reached, a is thrown + instead of continuing and crashing with a . + + + + + Gets the type of node. + + + + + Performs an implicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from string[] to . + + The value. + The result of the conversion. + + + + Converts a to a string by returning its value. + + + + + Gets the nth element in a . + + + + + Gets the value associated with a key in a . + + + + + Comparer that is based on identity comparisons. + + + + + + + + + + + Specifies the type of node in the representation model. + + + + + The node is a . + + + + + The node is a . + + + + + The node is a . + + + + + The node is a . + + + + + Represents a scalar node in the YAML document. + + + + + Gets or sets the value of the node. + + The value. + + + + Gets or sets the style of the node. + + The style. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The value. + + + + Resolves the aliases that could not be resolved when the node was created. + + The state of the document. + + + + Saves the current node to the specified emitter. + + The emitter where the node is to be saved. + The state. + + + + Accepts the specified visitor by calling the appropriate Visit method on it. + + + A . + + + + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Recursively enumerates all the nodes from the document, starting on the current node, + and throwing + if is reached. + + + + + Gets the type of node. + + + + + Represents a sequence node in the YAML document. + + + + + Gets the collection of child nodes. + + The children. + + + + Gets or sets the style of the node. + + The style. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Adds the specified child to the collection. + + The child. + + + + Adds a scalar node to the collection. + + The child. + + + + Resolves the aliases that could not be resolved when the node was created. + + The state of the document. + + + + Saves the current node to the specified emitter. + + The emitter where the node is to be saved. + The state. + + + + Accepts the specified visitor by calling the appropriate Visit method on it. + + + A . + + + + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Recursively enumerates all the nodes from the document, starting on the current node, + and throwing + if is reached. + + + + + Gets the type of node. + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + + + + Represents an YAML stream. + + + + + Gets the documents inside the stream. + + The documents. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Adds the specified document to the collection. + + The document. + + + + Loads the stream from the specified input. + + The input. + + + + Loads the stream from the specified . + + + + + Saves the stream to the specified output. + + The output. + + + + Saves the stream to the specified output. + + The output. + Indicates whether or not to assign node anchors. + + + + Saves the stream to the specified emitter. + + The emitter. + Indicates whether or not to assign node anchors. + + + + Accepts the specified visitor by calling the appropriate Visit method on it. + + + A . + + + + + + + + Abstract implementation of that knows how to walk a complete Yaml object model. + + + + + Called when this object is visiting a . + + + The that is being visited. + + + + + Called after this object finishes visiting a . + + + The that has been visited. + + + + + Called when this object is visiting a . + + + The that is being visited. + + + + + Called after this object finishes visiting a . + + + The that has been visited. + + + + + Called when this object is visiting a . + + + The that is being visited. + + + + + Called after this object finishes visiting a . + + + The that has been visited. + + + + + Called when this object is visiting a . + + + The that is being visited. + + + + + Called after this object finishes visiting a . + + + The that has been visited. + + + + + Called when this object is visiting a . + + + The that is being visited. + + + + + Called after this object finishes visiting a . + + + The that has been visited. + + + + + Visits every child of a . + + + The that is being visited. + + + + + Visits every child of a . + + + The that is being visited. + + + + + Visits every child of a . + + + The that is being visited. + + + + + Visits every child of a . + + + The that is being visited. + + + + + Abstract implementation of that knows how to walk a complete YAML object model. + + + + + Called when this object is visiting a . + + + The that is being visited. + + + + + Called when this object is visiting a . + + + The that is being visited. + + + + + Called when this object is visiting a . + + + The that is being visited. + + + + + Called when this object is visiting a . + + + The that is being visited. + + + + + Called when this object is visiting a . + + + The that is being visited. + + + + + Called when this object is visiting a key-value pair. + + The left (key) that is being visited. + The right (value) that is being visited. + + + + Visits every child of a . + + + The that is being visited. + + + + + Visits every child of a . + + + The that is being visited. + + + + + Visits every child of a . + + + The that is being visited. + + + + + Visits every child of a . + + + The that is being visited. + + + + + Wraps a instance and allows it to be buffered as a LinkedList in memory and replayed. + + + + + Initializes a new instance of the class. + + The Parser to buffer. + The maximum depth of the parser to buffer before raising an ArgumentOutOfRangeException. + The maximum length of the LinkedList can buffer before raising an ArgumentOutOfRangeException. + If parser does not fit within the max depth and length specified. + + + + Gets the current event. Returns null after returns false. + + + + + Moves to the next event. + + Returns true if there are more events available, otherwise returns false. + + + + Resets the buffer back to it's first event. + + + + + The TypeDiscriminatingNodeDeserializer acts as a psuedo . + If any of it's has a matching BaseType, the TypeDiscriminatingNodeDeserializer will + begin buffering the yaml stream. It will then use the matching s to determine + a dotnet output type for the yaml node. As the node is buffered, the s are + able to examine the actual values within, and use these when discriminating a type. + Once a matching type is found, the TypeDiscriminatingNodeDeserializer uses it's inner deserializers to perform + the final deserialization for that type & object. + Usually you will want all default s that exist in the outer + to also be used as inner deserializers. + + + + + Adds an to be checked by the TypeDiscriminatingNodeDeserializer. + + The to add. + + + + Adds a to be checked by the TypeDiscriminatingNodeDeserializer. + s use the value of a specified key on the yaml object to map + to a target type. + + The yaml key to discriminate on. + A dictionary of values for the yaml key mapping to their respective types. + + + + Adds a to be checked by the TypeDiscriminatingNodeDeserializer. + s use the presence of unique keys on the yaml object to map + to different target types. + + A dictionary of unique yaml keys mapping to their respective types. + + + + An ITypeDiscriminator provides an interface for discriminating which dotnet type to deserialize a yaml + stream into. They require the yaml stream to be buffered as they + can inspect the yaml value, determine the desired type, and reset the yaml stream to then deserialize into + that type. + + + + + Gets the BaseType of the discriminator. All types that an ITypeDiscriminator may discriminate into must + inherit from this type. This enables the deserializer to only buffer values of matching types. + If you would like an ITypeDiscriminator to discriminate all yaml values, the BaseType will be object. + + + + + Trys to discriminate a type from the current IParser. As discriminating the type will consume the parser, the + parser will usually need to be a buffer so an instance of the discriminated type can be deserialized later. + + The IParser to consume and discriminate a type from. + The output type discriminated. Null if no type matched the discriminator. + Returns true if the discriminator matched the yaml stream. + + + + A TypeDiscriminator that discriminates which type to deserialize a yaml stream into by checking the value + of a known key. + + + + + Initializes a new instance of the class. + The KeyValueTypeDiscriminator will check the target key specified, and if it's value is contained within the + type mapping dictionary, the coresponding type will be discriminated. + + The base type which all discriminated types will implement. Use object if you're discriminating + unrelated types. Note the less specific you are with the base type the more yaml will need to be buffered. + The known key to check the value of when discriminating. + A mapping dictionary of yaml values to types. + If any of the target types do not implement the base type. + + + + Checks if the current parser contains the target key, and that it's value matches one of the type mappings. + If so, return true, and the matching type. + Otherwise, return false. + This will consume the parser, so you will usually need the parser to be a buffer so an instance + of the discriminated type can be deserialized later. + + The IParser to consume and discriminate a type from. + The output type discriminated. Null if there target key was not present of if the value + of the target key was not within the type mapping. + Returns true if the discriminator matched the yaml stream. + + + + A TypeDiscriminator that discriminates which type to deserialize a yaml stream into by checking the existence + of specific keys. + + + + + Initializes a new instance of the class. + The UniqueKeyTypeDiscriminator will check if any of the keys specified exist, and discriminate the coresponding type. + + The base type which all discriminated types will implement. Use object if you're discriminating + unrelated types. Note the less specific you are with the base type the more yaml will need to be buffered. + A mapping dictionary of yaml keys to types. + If any of the target types do not implement the base type. + + + + Checks if the current parser contains of the unique keys this discriminator has in it's type mapping. + If so, return true, and the matching type. + Otherwise, return false. + This will consume the parser, so you will usually need the parser to be a buffer so an instance + of the discriminated type can be deserialized later. + + The IParser to consume and discriminate a type from. + The output type discriminated. Null if there target key was not present of if the value + of the target key was not within the type mapping. + Returns true if the discriminator matched the yaml stream. + + + + Common implementation of and . + + + + + Prevents serialization and deserialization of fields. + + + + + + Allows serialization and deserialization of non-public properties. + + + + + Calling this will enable the support for private constructors when considering serialization and deserialization. + + + + + Sets the that will be used by the (de)serializer. + + + + + Sets the to use when handling enum's. + + Naming convention to use when handling enum's + + + + + Sets the that will be used by the (de)serializer. + + + + + Register an for a given property. + + + An expression in the form: x => x.SomeProperty + The attribute to register. + + + + + Register an for a given property. + + + + + Registers an additional to be used by the (de)serializer. + + + + + Registers an additional to be used by the (de)serializer. + + + Configures the location where to insert the + + + + Registers an additional to be used by the (de)serializer. + + A factory that creates the based on a previously registered . + Configures the location where to insert the + + + + Unregisters an existing of type . + + + + + Unregisters an existing of type . + + + + + Registers an additional to be used by the (de)serializer. + + A function that instantiates the type inspector. + + + + Registers an additional to be used by the (de)serializer. + + A function that instantiates the type inspector. + Configures the location where to insert the + + + + Registers an additional to be used by the (de)serializer. + + A function that instantiates the type inspector based on a previously registered .. + Configures the location where to insert the + + + + Unregisters an existing of type . + + + + + Unregisters an existing of type . + + + + + Override the default yaml formatter with the one passed in + + to use when serializing and deserializing objects. + + + + + + A factory that creates instances of based on an existing . + + The type of the wrapped component. + The type of the component that this factory creates. + The component that is to be wrapped. + Returns a new instance of that is based on . + + + + A factory that creates instances of based on an existing and an argument. + + The type of the argument. + The type of the wrapped component. + The type of the component that this factory creates. + The component that is to be wrapped. + The argument of the factory. + Returns a new instance of that is based on and . + + + + This represents the YAML converter entity for . + + + + + Initializes a new instance of the class. + + instance. Default value is . + If true, will use double quotes when writing the value to the stream. + List of date/time formats for parsing. Default value is "d". + On deserializing, all formats in the list are used for conversion, while on serializing, the first format in the list is used. + + + + Gets a value indicating whether the current converter supports converting the specified type. + + to check. + Returns True, if the current converter supports; otherwise returns False. + + + + Reads an object's state from a YAML parser. + + instance. + to convert. + Returns the instance converted. + On deserializing, all formats in the list are used for conversion. + + + + Writes the specified object's state to a YAML emitter. + + instance. + Value to write. + to convert. + On serializing, the first format in the list is used. + + + + This represents the YAML converter entity for . + + + + + Initializes a new instance of the class. + + value. Default value is . is considered as . + instance. Default value is . + If true, will use double quotes when writing the value to the stream. + List of date/time formats for parsing. Default value is "G". + On deserializing, all formats in the list are used for conversion, while on serializing, the first format in the list is used. + + + + Gets a value indicating whether the current converter supports converting the specified type. + + to check. + Returns True, if the current converter supports; otherwise returns False. + + + + Reads an object's state from a YAML parser. + + instance. + to convert. + Returns the instance converted. + On deserializing, all formats in the list are used for conversion. + + + + Writes the specified object's state to a YAML emitter. + + instance. + Value to write. + to convert. + On serializing, the first format in the list is used. + + + + Converts the object to a string representation + To use this converter, call WithTypeConverter(new DateTimeOffsetConverter()) on the + or . + + + + + Initializes a new instance of the class. + + instance. Default value is . + If true, will use double quotes when writing the value to the stream. + + List of date/time formats for parsing. Default value is "O". + On deserializing, all formats in the list are used for conversion, while on serializing, the first format in the list is used. + + + + Gets a value indicating whether the current converter supports converting the specified type. + + to check. + Returns True, if the current converter supports; otherwise returns False. + + + + Reads an object's state from a YAML parser. + + instance. + to convert. + Returns the instance converted. + On deserializing, all formats in the list are used for conversion. + + + + Writes the specified object's state to a YAML emitter. + + instance. + Value to write. + to convert. + On serializing, the first format in the list is used. + + + + Converter for System.Guid. + + + + + Converter for System.Type. + + + Converts to a scalar containing the assembly qualified name of the type. + + + + + This represents the YAML converter entity for . + + + + + Initializes a new instance of the class. + + instance. Default value is . + If true, will use double quotes when writing the value to the stream. + List of date/time formats for parsing. Default value is "T". + On deserializing, all formats in the list are used for conversion, while on serializing, the first format in the list is used. + + + + Gets a value indicating whether the current converter supports converting the specified type. + + to check. + Returns True, if the current converter supports; otherwise returns False. + + + + Reads an object's state from a YAML parser. + + instance. + to convert. + Returns the instance converted. + On deserializing, all formats in the list are used for conversion. + + + + Writes the specified object's state to a YAML emitter. + + instance. + Value to write. + to convert. + On serializing, the first format in the list is used. + + + + Specifies the strategy to handle default and null values during serialization of properties. + + + + + Specifies that all properties are to be emitted regardless of their value. This is the default behavior. + + + + + Specifies that properties that contain null references or a null Nullable<T> are to be omitted. + + + + + Specifies that properties that that contain their default value, either default(T) or the value specified in DefaultValueAttribute are to be omitted. + + + + + Specifies that properties that that contain collections/arrays/enumerations that are empty are to be omitted. + + + + + Deserializes objects from the YAML format. + To customize the behavior of , + use the class. + + + + + Initializes a new instance of using the default configuration. + + + To customize the behavior of the deserializer, use . + + + + + This constructor is private to discourage its use. + To invoke it, call the method. + + + + + Creates a new that uses the specified . + This method is available for advanced scenarios. The preferred way to customize the behavior of the + deserializer is to use . + + + + + Deserializes an object of the specified type. + + The from where to deserialize the object. + The static type of the object to deserialize. + Returns the deserialized object. + + + + Creates and configures instances of . + This class is used to customize the behavior of . Use the relevant methods + to apply customizations, then call to create an instance of the deserializer + with the desired customizations. + + + + + Initializes a new using the default component registrations. + + + + + When deserializing it will attempt to convert unquoted strings to their correct datatype. If conversion is not sucessful, it will leave it as a string. + This option is only applicable when not specifying a type or specifying the object type during deserialization. + + + + + Sets the that will be used by the deserializer. + + + + + Sets the that will be used by the deserializer. + + + + + Registers an additional to be used by the deserializer. + + + + + Registers an additional to be used by the deserializer. + + + Configures the location where to insert the + + + + Registers an additional to be used by the deserializer. + + A factory that creates the based on a previously registered . + Configures the location where to insert the + + + + Unregisters an existing of type . + + + + + Unregisters an existing of type . + + + + + Registers a to be used by the deserializer. This internally registers + all existing as inner deserializers available to the . + Usually you will want to call this after any other changes to the s used by the deserializer. + + An action that can configure the . + Configures the max depth of yaml nodes that will be buffered. A value of -1 (the default) means yaml nodes of any depth will be buffered. + Configures the max number of yaml nodes that will be buffered. A value of -1 (the default) means there is no limit on the number of yaml nodes buffered. + + + + Registers an additional to be used by the deserializer. + + + + + Registers an additional to be used by the deserializer. + + + Configures the location where to insert the + + + + Registers an additional to be used by the deserializer. + + A factory that creates the based on a previously registered . + Configures the location where to insert the + + + + Unregisters an existing of type . + + + + + Unregisters an existing of type . + + + + + Registers a tag mapping. + + + + + Registers a type mapping using the default object factory. + + + + + Unregisters an existing tag mapping. + + + + + Instructs the deserializer to ignore unmatched properties instead of throwing an exception. + + + + + Instructs the deserializer to check for duplicate keys and throw an exception if duplicate keys are found. + + + + + + Creates a new according to the current configuration. + + + + + Creates a new that implements the current configuration. + This method is available for advanced scenarios. The preferred way to customize the behavior of the + deserializer is to use the method. + + + + + Gets the next visitor that should be called by the current visitor. + + + + + Gets the that is to be used for serialization. + + + + + Gets a function that, when called, serializes the specified object. + + + + + Gets the visitor of type that was used during the pre-processing phase. + + The type of the visitor.s + + + No visitor of that type has been registered, + or ore than one visitors registered are of type . + + + + + Provided the base implementation for an IEventEmitter that is a + decorator for another IEventEmitter. + + + + + This pattern matches strings that are special both in YAML 1.1 and 1.2 + + + + + Deserializes an object of the specified type. + + The from where to deserialize the object. + The static type of the object to deserialize. + Returns the deserialized object. + + + + Translates property names according to a specific convention. + + + + + Determines the type of the specified node. + + The node to be deserialized. + The type that has been determined so far. + + true if has been resolved completely; + false if the next type should be invoked. + + + + + The interface to implement for getting/setting an objects fields and properties when using a static context + + + + + Set a field/property value + + Name of the field or property. + Object to set the field/property on. + Value to set the field/property to. + + + + Reads a value from a field/property + + Name of the field or property. + Object to get the field/property from. + + + + + Represents an object along with its type. + + + + + A reference to the object. + + + + + The type that should be used when to interpret the . + + + + + The type of as determined by its container (e.g. a property). + + + + + The style to be used for scalars. + + + + + Returns the Value property of the if it is not null. + This is useful in all places that the value must not be null. + + An object descriptor. + Thrown when the Value is null + + + + + Creates instances of types. + + + This interface allows to provide a custom logic for creating instances during deserialization. + + + + + Creates an instance of the specified type. + + + + + Creates a default value for the .net primitive types (string, int, bool, etc) + + + + + + + If the type is convertable to a non generic dictionary, then it will do so and set dictionary and genericArguments to the correct values and return true. + If not, values will be null and the result will be false.. + + Object descriptor to try and convert + The converted dictionary + Generic type arguments that specify the key and value type + True if converted, false if not + + + + Gets the type of the value part of a dictionary or list. + + + + + + + Executes the methods on the object that has the attribute + + + + + + Executes the methods on the object that has the attribute + + + + + + Executes the methods on the object that has the attribute + + + + + + Executes the methods on the object that has the attribute + + + + + + Defines a strategy that walks through an object graph. + + + + + Traverses the specified object graph. + + The graph. + An that is to be notified during the traversal. + A that will be passed to the . + + + + Defined the interface of a type that can be notified during an object graph traversal. + + + + + Indicates whether the specified value should be entered. This allows the visitor to + override the handling of a particular object or type. + + The value that is about to be entered. + The context that this implementation depend on. + If the value is to be entered, returns true; otherwise returns false; + + + + Indicates whether the specified mapping should be entered. This allows the visitor to + override the handling of a particular pair. + + The key of the mapping that is about to be entered. + The value of the mapping that is about to be entered. + The context that this implementation depend on. + If the mapping is to be entered, returns true; otherwise returns false; + + + + Indicates whether the specified mapping should be entered. This allows the visitor to + override the handling of a particular pair. This overload should be invoked when the + mapping is produced by an object's property. + + The that provided access to . + The value of the mapping that is about to be entered. + The context that this implementation depend on. + If the mapping is to be entered, returns true; otherwise returns false; + + + + Notifies the visitor that a scalar value has been encountered. + + The value of the scalar. + The context that this implementation depend on. + + + + Notifies the visitor that the traversal of a mapping is about to begin. + + The value that corresponds to the mapping. + The static type of the keys of the mapping. + The static type of the values of the mapping. + The context that this implementation depend on. + + + + Notifies the visitor that the traversal of a mapping has ended. + + The value that corresponds to the mapping. + The context that this implementation depend on. + + + + Notifies the visitor that the traversal of a sequence is about to begin. + + The value that corresponds to the sequence. + The static type of the elements of the sequence. + The context that this implementation depend on. + + + + Notifies the visitor that the traversal of a sequence has ended. + + The value that corresponds to the sequence. + The context that this implementation depend on. + + + + Registers the component in place of the already registered component of type . + + + + + Registers the component before the already registered component of type . + + + + + Registers the component after the already registered component of type . + + + + + Registers the component before every other previously registered component. + + + + + Registers the component after every other previously registered component. + + + + + Registers the component in place of the already registered component of type . + + + + + Serializes the specified object into a string. + + The object to serialize. + + + + Serializes the specified object into a string. + + The object to serialize. + The static type of the object to serialize. + + + + Serializes the specified object. + + The where to serialize the object. + The object to serialize. + + + + Serializes the specified object. + + The where to serialize the object. + The object to serialize. + The static type of the object to serialize. + + + + Serializes the specified object. + + The where to serialize the object. + The object to serialize. + + + + Serializes the specified object. + + The where to serialize the object. + The object to serialize. + The static type of the object to serialize. + + + + Provides access to the properties of a type. + + + + + Gets all properties of the specified type. + + The type whose properties are to be enumerated. + The actual object of type whose properties are to be enumerated. Can be null. + + + + + Gets the property of the type with the specified name. + + The type whose properties are to be searched. + The actual object of type whose properties are to be searched. Can be null. + The name of the property. + + Determines if an exception or null should be returned if can't be + found in + + + + + + Resolves the type of values. + + + + + Allows an object to customize how it is serialized and deserialized. + + + + + Reads this object's state from a YAML parser. + + The parser where the object's state should be read from. + The type that the deserializer is expecting. + + A function that will use the current deserializer + to read an object of the given type from the parser. + + + + + Writes this object's state to a YAML emitter. + + The emitter where the object's state should be written to. + A function that will use the current serializer to write an object to the emitter. + + + + Represents a function that is used to deserialize an object of the given type. + + The type that the deserializer should read. + Returns the object that was deserialized. + + + + Represents a function that is used to serialize an object of the given type. + + The object to be serialized. + + The type that should be considered when emitting the object. + If null, the actual type of the is used. + + + + + Allows an object to customize how it is serialized and deserialized. + + + + + Reads this object's state from a YAML parser. + + + + + Writes this object's state to a YAML emitter. + + + + + Allows to customize how a type is serialized and deserialized. + + + + + Gets a value indicating whether the current converter supports converting the specified type. + + + + + Reads an object's state from a YAML parser. + + + + + Writes the specified object's state to a YAML emitter. + + + + + Convert the string with underscores (this_is_a_test) or hyphens (this-is-a-test) to + camel case (thisIsATest). Camel case is the same as Pascal case, except the first letter + is lowercase. + + + + + Convert the string from camelcase (thisIsATest) to a hyphenated (this-is-a-test) string + + + + + Convert the string with underscores (this_is_a_test) or hyphens (this-is-a-test) to + lower case (thisisatest). + + + + + Performs no naming conversion. + + + + + Convert the string with underscores (this_is_a_test) or hyphens (this-is-a-test) to + pascal case (ThisIsATest). Pascal case is the same as camel case, except the first letter + is uppercase. + + + + + Convert the string from camelcase (thisIsATest) to a underscored (this_is_a_test) string + + + + + An empty type for cases where a type needs to be provided but won't be used. + + + + + Creates objects using Activator.CreateInstance. + + + + + Creates objects using a Func{Type,object}"/>. + + + + + + + + + + + + + + + + + Gets information about and creates statically known, serializable, types. + + + + + Create an object of the specified type + + Type of object to create + + + + + Creates an array of the specified type with the size specified + + The type of the array, should be the whole type, not just the value type + How large the array should be + + + + + Gets whether the type is a dictionary or not + + Type to check + + + + + Gets whether the type is an array or not + + Type to check + + + + + Gets whether the type is a list + + Type to check + + + + + Gets the type of the key of a dictionary + + + + + + + Gets the type of the value part of a dictionary or list. + + + + + + + Creates the default value of primitive types + + + + + + + The static implementation of yamldotnet doesn't support generating types, so we will return null's and false since we can't do anything. + + + + + + + + + An implementation of that traverses + readable properties, collections and dictionaries. + + + + + An implementation of that traverses + properties that are read/write, collections and dictionaries, while ensuring that + the graph can be regenerated from the resulting document. + + + + + A factory method for creating instances + + The type inspector to be used by the traversal strategy. + The type resolver to be used by the traversal strategy. + The type converters to be used by the traversal strategy. + The maximum object depth to be supported by the traversal strategy. + + + + + A base class that simplifies the correct implementation of . + + + + + Initializes a new instance of using the default configuration. + + + To customize the behavior of the serializer, use . + + + + + This constructor is private to discourage its use. + To invoke it, call the method. + + + + + Creates a new that uses the specified . + This method is available for advanced scenarios. The preferred way to customize the behavior of the + deserializer is to use . + + + + + Serializes the specified object into a string. + + The object to serialize. + + + + Serializes the specified object into a string. + + The object to serialize. + The static type of the object to serialize. + + + + Serializes the specified object. + + The where to serialize the object. + The object to serialize. + + + + Serializes the specified object. + + The where to serialize the object. + The object to serialize. + The static type of the object to serialize. + + + + Serializes the specified object. + + The where to serialize the object. + The object to serialize. + + + + Serializes the specified object. + + The where to serialize the object. + The object to serialize. + The static type of the object to serialize. + + + + Creates and configures instances of . + This class is used to customize the behavior of . Use the relevant methods + to apply customizations, then call to create an instance of the serializer + with the desired customizations. + + + + + Put double quotes around strings that need it, for example Null, True, False, a number. This should be called before any other "With" methods if you want this feature enabled. + + Also quote strings that are valid scalars in the YAML 1.1 specification (which includes boolean Yes/No/On/Off, base 60 numbers and more) + + + + Sets the default quoting style for scalar values. The default value is + + + + + Sets the maximum recursion that is allowed while traversing the object graph. The default value is 50. + + + + + Registers an additional to be used by the serializer. + + A function that instantiates the event emitter. + + + + Registers an additional to be used by the serializer. + + A function that instantiates the event emitter. + Configures the location where to insert the + + + + Registers an additional to be used by the serializer. + + A function that instantiates the event emitter based on a previously registered . + Configures the location where to insert the + + + + Unregisters an existing of type . + + + + + Unregisters an existing of type . + + + + + Registers a tag mapping. + + + + + Unregisters an existing tag mapping. + + + + + Ensures that it will be possible to deserialize the serialized objects. + This option will force the emission of tags and emit only properties with setters. + + + + + Specifies that, if the same object appears more than once in the + serialization graph, it will be serialized each time instead of just once. + + + If the serialization graph contains circular references and this flag is set, + a StackOverflowException will be thrown. + If this flag is not set, there is a performance penalty because the entire + object graph must be walked twice. + + + + + Forces every value to be serialized, even if it is the default value for that type. + + + + + Configures how properties with default and null values should be handled. The default value is DefaultValuesHandling.Preserve + + + If more control is needed, create a class that extends from ChainedObjectGraphVisitor and override its EnterMapping methods. + Then register it as follows: + WithEmissionPhaseObjectGraphVisitor(args => new MyDefaultHandlingStrategy(args.InnerVisitor)); + + + + + Ensures that the result of the serialization is valid JSON. + + + + + Allows you to override the new line character to use when serializing to YAML. + + NewLine character(s) to use when serializing to YAML. + + + + Registers an additional to be used by the serializer + before emitting an object graph. + + + Registering a visitor in the pre-processing phase enables to traverse the object graph once + before actually emitting it. This allows a visitor to collect information about the graph that + can be used later by another visitor registered in the emission phase. + + The type inspector. + + + + Registers an additional to be used by the serializer + before emitting an object graph. + + + Registering a visitor in the pre-processing phase enables to traverse the object graph once + before actually emitting it. This allows a visitor to collect information about the graph that + can be used later by another visitor registered in the emission phase. + + A function that instantiates the type inspector. + + + + Registers an additional to be used by the serializer + before emitting an object graph. + + + Registering a visitor in the pre-processing phase enables to traverse the object graph once + before actually emitting it. This allows a visitor to collect information about the graph that + can be used later by another visitor registered in the emission phase. + + The type inspector. + Configures the location where to insert the + + + + Registers an additional to be used by the serializer + before emitting an object graph. + + + Registering a visitor in the pre-processing phase enables to traverse the object graph once + before actually emitting it. This allows a visitor to collect information about the graph that + can be used later by another visitor registered in the emission phase. + + A function that instantiates the type inspector. + Configures the location where to insert the + + + + Registers an additional to be used by the serializer + before emitting an object graph. + + + Registering a visitor in the pre-processing phase enables to traverse the object graph once + before actually emitting it. This allows a visitor to collect information about the graph that + can be used later by another visitor registered in the emission phase. + + A function that instantiates the type inspector based on a previously registered . + Configures the location where to insert the + + + + Registers an additional to be used by the serializer + before emitting an object graph. + + + Registering a visitor in the pre-processing phase enables to traverse the object graph once + before actually emitting it. This allows a visitor to collect information about the graph that + can be used later by another visitor registered in the emission phase. + + A function that instantiates the type inspector based on a previously registered . + Configures the location where to insert the + + + + Unregisters an existing of type . + + + + + Unregisters an existing of type . + + + + + Registers an to be used by the serializer + while traversing the object graph. + + A function that instantiates the traversal strategy. + + + + Registers an additional to be used by the serializer + while emitting an object graph. + + A function that instantiates the type inspector. + + + + Registers an additional to be used by the serializer + while emitting an object graph. + + A function that instantiates the type inspector. + Configures the location where to insert the + + + + Registers an additional to be used by the serializer + while emitting an object graph. + + A function that instantiates the type inspector based on a previously registered . + Configures the location where to insert the + + + + Unregisters an existing of type . + + + + + Unregisters an existing of type . + + + + + Creates sequences with extra indentation + + + list: + - item + - item + + + + + + Creates a new according to the current configuration. + + + + + Creates a new that implements the current configuration. + This method is available for advanced scenarios. The preferred way to customize the behavior of the + deserializer is to use the method. + + + + + If true then private, parameterless constructors will be invoked if a public one is not available. + + + + + Common implementation of and . + + + + + Sets the that will be used by the (de)serializer. + + + + + Sets the to use when handling enum's. + + Naming convention to use when handling enum's + + + + + Sets the that will be used by the (de)serializer. + + + + + Registers an additional to be used by the (de)serializer. + + + + + Registers an additional to be used by the (de)serializer. + + + Configures the location where to insert the + + + + Registers an additional to be used by the (de)serializer. + + A factory that creates the based on a previously registered . + Configures the location where to insert the + + + + Unregisters an existing of type . + + + + + Unregisters an existing of type . + + + + + Registers an additional to be used by the (de)serializer. + + A function that instantiates the type inspector. + + + + Registers an additional to be used by the (de)serializer. + + A function that instantiates the type inspector. + Configures the location where to insert the + + + + Registers an additional to be used by the (de)serializer. + + A function that instantiates the type inspector based on a previously registered .. + Configures the location where to insert the + + + + Unregisters an existing of type . + + + + + Unregisters an existing of type . + + + + + Override the default yaml formatter with the one passed in + + to use when serializing and deserializing objects. + + + + + + Holds the static object factory and type inspector to use when statically serializing/deserializing YAML. + + + + + Gets whether the type is known to the context + + Type to check + + + + + Gets the to use for serialization + + + + + + Gets the factory to use for serialization and deserialization + + + + + + Gets the type inspector to use when statically serializing/deserializing YAML. + + + + + + Creates and configures instances of . + This class is used to customize the behavior of . Use the relevant methods + to apply customizations, then call to create an instance of the deserializer + with the desired customizations. + + + + + Initializes a new using the default component registrations. + + + + + When deserializing it will attempt to convert unquoted strings to their correct datatype. If conversion is not sucessful, it will leave it as a string. + This option is only applicable when not specifying a type or specifying the object type during deserialization. + + + + + Registers an additional to be used by the deserializer. + + + + + Registers an additional to be used by the deserializer. + + + Configures the location where to insert the + + + + Registers an additional to be used by the deserializer. + + A factory that creates the based on a previously registered . + Configures the location where to insert the + + + + Unregisters an existing of type . + + + + + Unregisters an existing of type . + + + + + Registers a to be used by the deserializer. This internally registers + all existing as inner deserializers available to the . + Usually you will want to call this after any other changes to the s used by the deserializer. + + An action that can configure the . + Configures the max depth of yaml nodes that will be buffered. A value of -1 (the default) means yaml nodes of any depth will be buffered. + Configures the max number of yaml nodes that will be buffered. A value of -1 (the default) means there is no limit on the number of yaml nodes buffered. + + + + Registers an additional to be used by the deserializer. + + + + + Registers an additional to be used by the deserializer. + + + Configures the location where to insert the + + + + Registers an additional to be used by the deserializer. + + A factory that creates the based on a previously registered . + Configures the location where to insert the + + + + Unregisters an existing of type . + + + + + Unregisters an existing of type . + + + + + Registers a tag mapping. + + + + + Registers a type mapping using the default object factory. + + + + + Unregisters an existing tag mapping. + + + + + Instructs the deserializer to ignore unmatched properties instead of throwing an exception. + + + + + Instructs the deserializer to check for duplicate keys and throw an exception if duplicate keys are found. + + + + + + Creates a new according to the current configuration. + + + + + Creates a new that implements the current configuration. + This method is available for advanced scenarios. The preferred way to customize the behavior of the + deserializer is to use the method. + + + + + Creates and configures instances of . + This class is used to customize the behavior of . Use the relevant methods + to apply customizations, then call to create an instance of the serializer + with the desired customizations. + + + + + Put double quotes around strings that need it, for example Null, True, False, a number. This should be called before any other "With" methods if you want this feature enabled. + + Also quote strings that are valid scalars in the YAML 1.1 specification (which includes boolean Yes/No/On/Off, base 60 numbers and more) + + + + Put double quotes around strings that need it, for example Null, True, False, a number. This should be called before any other "With" methods if you want this feature enabled. + + + + + Sets the default quoting style for scalar values. The default value is + + + + + Sets the maximum recursion that is allowed while traversing the object graph. The default value is 50. + + + + + Registers an additional to be used by the serializer. + + A function that instantiates the event emitter. + + + + Registers an additional to be used by the serializer. + + A function that instantiates the event emitter. + Configures the location where to insert the + + + + Registers an additional to be used by the serializer. + + A function that instantiates the event emitter based on a previously registered . + Configures the location where to insert the + + + + Unregisters an existing of type . + + + + + Unregisters an existing of type . + + + + + Registers a tag mapping. + + + + + Unregisters an existing tag mapping. + + + + + Ensures that it will be possible to deserialize the serialized objects. + This option will force the emission of tags and emit only properties with setters. + + + + + Specifies that, if the same object appears more than once in the + serialization graph, it will be serialized each time instead of just once. + + + If the serialization graph contains circular references and this flag is set, + a StackOverflowException will be thrown. + If this flag is not set, there is a performance penalty because the entire + object graph must be walked twice. + + + + + Forces every value to be serialized, even if it is the default value for that type. + + + + + Configures how properties with default and null values should be handled. The default value is DefaultValuesHandling.Preserve + + + If more control is needed, create a class that extends from ChainedObjectGraphVisitor and override its EnterMapping methods. + Then register it as follows: + WithEmissionPhaseObjectGraphVisitor(args => new MyDefaultHandlingStrategy(args.InnerVisitor)); + + + + + Ensures that the result of the serialization is valid JSON. + + + + + Allows you to override the new line character to use when serializing to YAML. + + NewLine character(s) to use when serializing to YAML. + + + + Registers an additional to be used by the serializer + before emitting an object graph. + + + Registering a visitor in the pre-processing phase enables to traverse the object graph once + before actually emitting it. This allows a visitor to collect information about the graph that + can be used later by another visitor registered in the emission phase. + + The type inspector. + + + + Registers an additional to be used by the serializer + before emitting an object graph. + + + Registering a visitor in the pre-processing phase enables to traverse the object graph once + before actually emitting it. This allows a visitor to collect information about the graph that + can be used later by another visitor registered in the emission phase. + + A function that instantiates the type inspector. + + + + Registers an additional to be used by the serializer + before emitting an object graph. + + + Registering a visitor in the pre-processing phase enables to traverse the object graph once + before actually emitting it. This allows a visitor to collect information about the graph that + can be used later by another visitor registered in the emission phase. + + The type inspector. + Configures the location where to insert the + + + + Registers an additional to be used by the serializer + before emitting an object graph. + + + Registering a visitor in the pre-processing phase enables to traverse the object graph once + before actually emitting it. This allows a visitor to collect information about the graph that + can be used later by another visitor registered in the emission phase. + + A function that instantiates the type inspector. + Configures the location where to insert the + + + + Registers an additional to be used by the serializer + before emitting an object graph. + + + Registering a visitor in the pre-processing phase enables to traverse the object graph once + before actually emitting it. This allows a visitor to collect information about the graph that + can be used later by another visitor registered in the emission phase. + + A function that instantiates the type inspector based on a previously registered . + Configures the location where to insert the + + + + Registers an additional to be used by the serializer + before emitting an object graph. + + + Registering a visitor in the pre-processing phase enables to traverse the object graph once + before actually emitting it. This allows a visitor to collect information about the graph that + can be used later by another visitor registered in the emission phase. + + A function that instantiates the type inspector based on a previously registered . + Configures the location where to insert the + + + + Unregisters an existing of type . + + + + + Unregisters an existing of type . + + + + + Registers an to be used by the serializer + while traversing the object graph. + + A function that instantiates the traversal strategy. + + + + Registers an additional to be used by the serializer + while emitting an object graph. + + A function that instantiates the type inspector. + + + + Registers an additional to be used by the serializer + while emitting an object graph. + + A function that instantiates the type inspector. + Configures the location where to insert the + + + + Registers an additional to be used by the serializer + while emitting an object graph. + + A function that instantiates the type inspector based on a previously registered . + Configures the location where to insert the + + + + Unregisters an existing of type . + + + + + Unregisters an existing of type . + + + + + Creates sequences with extra indentation + + + list: + - item + - item + + + + + + Creates a new according to the current configuration. + + + + + Creates a new that implements the current configuration. + This method is available for advanced scenarios. The preferred way to customize the behavior of the + deserializer is to use the method. + + + + + An object that contains part of a YAML stream. + + + + + Gets or sets the events. + + The events. + + + + Reads this object's state from a YAML parser. + + + + + Writes this object's state to a YAML emitter. + + + + + Contains mappings between tags and types. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The mappings. + + + + Adds the specified tag. + + The tag. + The mapping. + + + + Gets the mapping. + + The tag. + + + + + Wraps another and applies caching. + + + + + Aggregates the results from multiple into a single one. + + + + + Wraps another and applies a + naming convention to the names of the properties. + + + + + Returns the properties of a type that are both readable and writable. + + + + + Returns the properties and fields of a type that are readable. + + + + + Returns the properties of a type that are readable. + + + + + Returns the properties of a type that are writable. + + + + + The type returned will be the actual type of the value, if available. + + + + + Except for primitive types, the type returned will always be the static type. + + + + + Indicates that a class used as deserialization state + needs to be notified after deserialization. + + + + + Convert a value to a specified type + + + + Naming convention to use on enums in the type converter. + + + + + Adds the specified anchor. + + The anchor. + The @object. + + + + Gets the anchor for the specified object. + + The object. + The anchor. + + + + + Gets the with the specified anchor. + + + + + + A generic container that is preserved during the entire deserialization process. + Any disposable object added to this collection will be disposed when this object is disposed. + + + + + Invokes on all + objects added to this collection that implement . + + + + + Various string extension methods + + + + + Convert the string with underscores (this_is_a_test) or hyphens (this-is-a-test) to + camel case (thisIsATest). Camel case is the same as Pascal case, except the first letter + is lowercase. + + String to convert + Converted string + + + + Convert the string with underscores (this_is_a_test) or hyphens (this-is-a-test) to + pascal case (ThisIsATest). Pascal case is the same as camel case, except the first letter + is uppercase. + + String to convert + Converted string + + + + Convert the string from camelcase (thisIsATest) to a hyphenated (this-is-a-test) or + underscored (this_is_a_test) string + + String to convert + Separator to use between segments + Converted string + + + + Performs type conversions using every standard provided by the .NET library. + + + + + Converts the specified value. + + The type to which the value is to be converted. + The value to convert. + Naming convention to apply to enums. + + + + + Converts the specified value. + + The type to which the value is to be converted. + The value to convert. + The provider. + Naming convention to apply to enums. + + + + + Converts the specified value. + + The type to which the value is to be converted. + The value to convert. + The culture. + Naming convention to apply to enums. + + + + + Converts the specified value using the invariant culture. + + The value to convert. + The type to which the value is to be converted. + Naming convention to apply to enums. + + + + + Converts the specified value. + + The value to convert. + The type to which the value is to be converted. + The format provider. + Naming convention to apply to enums. + + + + + Converts the specified value. + + The value to convert. + The type to which the value is to be converted. + The culture. + Naming convention to apply to enums. + + + + + Registers a dynamically. + + The type to which the converter should be associated. + The type of the converter. + + + + Define a collection of YamlAttribute Overrides for pre-defined object types. + + + + + Checks whether this mapping matches the specified type, and returns a value indicating the match priority. + + The priority of the match. Higher values have more priority. Zero indicates no match. + + + + Adds a Member Attribute Override + + Type + Class Member + Overriding Attribute + + + + Creates a copy of this instance. + + + + + Adds a Member Attribute Override + + + + + Applies the Yaml attribute overrides to another . + + + + + Applies the Yaml* attributes to another . + + + + + Converts an enum to it's string representation. + By default it will be the string representation of the enum passed through the naming convention. + + A string representation of the enum + + + + If this function returns true, the serializer will put quotes around the formatted enum value if necessary. Defaults to true. + + + + + Instructs the YamlSerializer not to serialize the public field or public read/write property value. + + + + + Provides special Yaml serialization instructions. + + + + + Decription/Comment about this property. + When set, a comment will be emitted when serializing this member. + + + + + Specifies that this property should be serialized as the given type, rather than using the actual runtime value's type. + + + + + Specifies the order priority of this property. + + + + + Instructs the to use a different field name for serialization. + + + + + When false, naming conventions will not be applied to this member. Defaults to true. + + + + + Specifies the scalar style of the property when serialized. This will only affect the serialization of scalar properties. + + + + + Overrides how null and default values should be handled for this property. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Specifies that this property should be serialized as the given type, rather than using the actual runtime value's type. + + + + Put this attribute either on serializable types or on the that you want + the static analyzer to detect and use. + + + + + Use this constructor if the attribute is placed on a serializable class. + + + + + Use this constructor if the attribute is placed on the . + + The type for which to include static code generation. + + + diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.xml.meta b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.xml.meta new file mode 100644 index 00000000..e7ba1988 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/Meryel.UnityCodeAssist.YamlDotNet.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3c5350d180083ae42b7b70e2b8520523 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/ExternalReferences/SystemBinariesForDotNetStandard20.unitypackage.meta b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/SystemBinariesForDotNetStandard20.unitypackage.meta new file mode 100644 index 00000000..f7922315 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ExternalReferences/SystemBinariesForDotNetStandard20.unitypackage.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 38c4af39af24e6844ae3e168ddd359b3 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/FeedbackWindow.cs b/Assets/Plugins/CodeAssist/Editor/FeedbackWindow.cs new file mode 100644 index 00000000..2fa0dcce --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/FeedbackWindow.cs @@ -0,0 +1,110 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +#pragma warning restore IDE0005 + + +#nullable enable + + +namespace Meryel.UnityCodeAssist.Editor +{ + public class FeedbackWindow : EditorWindow + { + + GUIStyle? styleLabel; + + public static void Display() + { + NetMQInitializer.Publisher?.SendRequestInternalLog(); + + // Get existing open window or if none, make a new one: + var window = GetWindow(); + window.Show(); + + Serilog.Log.Debug("Displaying feedback window"); + + NetMQInitializer.Publisher?.SendAnalyticsEvent("Gui", "FeedbackWindow_Display"); + } + + + private void OnEnable() + { + //**--icon + //var icon = AssetDatabase.LoadAssetAtPath("Assets/Sprites/Gear.png"); + //titleContent = new GUIContent("Code Assist", icon); + titleContent = new GUIContent("Code Assist Feedback"); + } + + private void OnGUI() + { + var errorCount = Logger.ELogger.GetErrorCountInInternalLog(); + var warningCount = Logger.ELogger.GetWarningCountInInternalLog(); + var logContent = Logger.ELogger.GetInternalLogContent(); + if (!string.IsNullOrEmpty(Logger.ELogger.VsInternalLog)) + logContent += Logger.ELogger.VsInternalLog; + + styleLabel ??= new GUIStyle(GUI.skin.label) + { + wordWrap = true, + alignment = TextAnchor.MiddleCenter, + }; + + if (errorCount > 0) + EditorGUILayout.LabelField($"{errorCount} error(s) found in logs. Please submit a feedback (via e-mail, Discord or GitHub) with the logs if possible.", styleLabel, GUILayout.ExpandWidth(true)); + else if (warningCount > 0) + EditorGUILayout.LabelField($"{warningCount} warnings(s) found in logs. Please submit a feedback (via e-mail, Discord or GitHub) with the logs if possible.", styleLabel, GUILayout.ExpandWidth(true)); + else + EditorGUILayout.LabelField("No errors found in logs. Please submit a feedback (via e-mail, Discord or GitHub) describing what went wrong or unexpected.", styleLabel, GUILayout.ExpandWidth(true)); + + if (GUILayout.Button("Send e-mail")) + { + var uri = "mailto:merryyellow@outlook.com"; + System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(uri)); + } + + if (GUILayout.Button("Send Discord message")) + { + //var uri = "discord://invites/2CgKHDq"; + var uri = "https://discord.gg/2CgKHDq"; + System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(uri)); + } + + if (GUILayout.Button("Submit GitHub issue")) + { + var uri = "https://github.com/merryyellow/Unity-Code-Assist/issues/new/choose"; + Application.OpenURL(uri); + } + + EditorGUILayout.Separator(); + + if (GUILayout.Button("View Unity full log")) + { + var filePath = Logger.ELogger.FilePath; + System.Diagnostics.Process.Start(filePath); + } + + if (GUILayout.Button("View Visual Studio full log")) + { + var filePath = Logger.ELogger.VSFilePath; + System.Diagnostics.Process.Start(filePath); + } + + if (GUILayout.Button("Copy recent logs to clipboard")) + { + GUIUtility.systemCopyBuffer = logContent; + } + + EditorGUILayout.LabelField("Recent logs:", styleLabel, GUILayout.ExpandWidth(true)); + EditorGUILayout.SelectableLabel(logContent, EditorStyles.textArea, GUILayout.ExpandHeight(true)); + } + + + + } +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/FeedbackWindow.cs.meta b/Assets/Plugins/CodeAssist/Editor/FeedbackWindow.cs.meta new file mode 100644 index 00000000..852cedbb --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/FeedbackWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e88fb5c7f1fb78e4e8af627b405441bd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/Input.meta b/Assets/Plugins/CodeAssist/Editor/Input.meta new file mode 100644 index 00000000..6c259cae --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Input.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b573a042cad194a4cb5317bfdbac6e42 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/Input/Binary2TextExec.cs b/Assets/Plugins/CodeAssist/Editor/Input/Binary2TextExec.cs new file mode 100644 index 00000000..b58eb750 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Input/Binary2TextExec.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using UnityEditor; +using UnityEngine; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +#pragma warning restore IDE0005 + + +#nullable enable + + +//namespace UTJ.UnityCommandLineTools +namespace Meryel.UnityCodeAssist.Editor.Input +{ + // + // bin2textをUnityEditorから実行する為のClass + // programed by Katsumasa.Kimura + // + public class Binary2TextExec : EditorToolExec + { + public Binary2TextExec() : base("binary2text") { } + + // + // bin2text filePath outPath options + // /summary> + public int Exec(string filePath, string outPath, string options) + { + var args = string.Format(@"""{0}"" ""{1}"" {2}", filePath, outPath, options); + return Exec(args); + } + + public int Exec(string filePath, string outPath, bool detailed = false, bool largeBinaryHashOnly = false, bool hexFloat = false) + { + //var args = string.Format(@"""{0}"" ""{1}"" {2}", filePath, outPath, options); + var args = string.Format(@"""{0}"" ""{1}""", filePath, outPath); + + if (detailed) + args += " -detailed"; + if (largeBinaryHashOnly) + args += " -largebinaryhashonly"; + if (hexFloat) + args += " -hexfloat"; + + return Exec(args); + } + } + + // + // UnityEditorに含まれるコマンドラインツールを実行する為の基底Class + // programed by Katsumasa.Kimura + // + public class EditorToolExec + { + // + // UnityEditorがインストールされているディレクトリへのパス + // + protected string mEditorPath; + + // + // Toolsディレクトリへのパス + // + protected string mToolsPath; + + // + // 実行ファイル名 + // + protected string mExecFname; + + // + // 実行ファイルへのフルパス + // + protected string mExecFullPath; + + // + // 実行結果のOUTPUT + // + private string? mOutput; + + // + // 実行結果のOUTPUT + // + public string? Output + { + get { return mOutput; } + } + + // + // コンストラクタ + // + // mExecFname : 実行ファイル名 + // + // /summary> + public EditorToolExec(string mExecFname) + { + mEditorPath = Path.GetDirectoryName(EditorApplication.applicationPath); + mToolsPath = Path.Combine(mEditorPath, @"Data/Tools"); + this.mExecFname = mExecFname; + //var files = Directory.GetFiles(mToolsPath, mExecFname, SearchOption.AllDirectories); + var files = Directory.GetFiles(mEditorPath, mExecFname + "*", SearchOption.AllDirectories); + + if (files.Length == 0) + Serilog.Log.Error("{App} app couldn't be found at {Path}", mExecFname, mEditorPath); + + mExecFullPath = files[0]; + } + + // + // コマンドラインツールを実行する + // + // arg : コマンドラインツールに渡す引数 + // + // + public int Exec(string arg) + { + int exitCode = -1; + + try + { + using var process = new Process(); + process.StartInfo.FileName = mExecFullPath; + process.StartInfo.Arguments = arg; + process.StartInfo.UseShellExecute = false; + process.StartInfo.RedirectStandardOutput = true; + process.StartInfo.CreateNoWindow = true; + process.Start(); + mOutput = process.StandardOutput.ReadToEnd(); + process.WaitForExit(); + exitCode = process.ExitCode; + process.Close(); + } + catch (Exception e) + { + //UnityEngine.Debug.Log(e); + Serilog.Log.Error(e, "Exception while running process at {Scope}.{Location}", nameof(EditorToolExec), nameof(Exec)); + } + + return exitCode; + } + } +} diff --git a/Assets/Plugins/CodeAssist/Editor/Input/Binary2TextExec.cs.meta b/Assets/Plugins/CodeAssist/Editor/Input/Binary2TextExec.cs.meta new file mode 100644 index 00000000..c444d949 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Input/Binary2TextExec.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dd9a554b9e7402f46b194e66da80296e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/Input/InputManagerMonitor.cs b/Assets/Plugins/CodeAssist/Editor/Input/InputManagerMonitor.cs new file mode 100644 index 00000000..089e5b05 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Input/InputManagerMonitor.cs @@ -0,0 +1,151 @@ +using System; +using System.Linq; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +#pragma warning restore IDE0005 + + +#nullable enable + + +namespace Meryel.UnityCodeAssist.Editor.Input +{ + + public class InputManagerMonitor + { + private static readonly Lazy _instance = new Lazy(() => new InputManagerMonitor()); + public static InputManagerMonitor Instance => _instance.Value; + + //UnityInputManager inputManager; + readonly string inputManagerFilePath; + DateTime previousTagManagerLastWrite; + + public InputManagerMonitor() + { + EditorApplication.update += Update; + inputManagerFilePath = CommonTools.GetInputManagerFilePath(); + + try + { + previousTagManagerLastWrite = System.IO.File.GetLastWriteTime(inputManagerFilePath); + } + catch (Exception ex) + { + Serilog.Log.Debug(ex, "Exception at {Location}", nameof(System.IO.File.GetLastWriteTime)); + } + } + + void Update() + { +#if !ENABLE_LEGACY_INPUT_MANAGER + return; +#endif + +#pragma warning disable CS0162 +#pragma warning disable IDE0035 + + var currentInputManagerLastWrite = previousTagManagerLastWrite; + try + { + currentInputManagerLastWrite = System.IO.File.GetLastWriteTime(inputManagerFilePath); + } + catch (Exception ex) + { + Serilog.Log.Debug(ex, "Exception at {Location}", nameof(System.IO.File.GetLastWriteTime)); + } + if (currentInputManagerLastWrite != previousTagManagerLastWrite) + { + previousTagManagerLastWrite = currentInputManagerLastWrite; + Bump(); + } + +#pragma warning restore CS0162 +#pragma warning restore IDE0035 + } + + public void Bump() + { +#if !ENABLE_LEGACY_INPUT_MANAGER + return; +#endif +#pragma warning disable CS0162 +#pragma warning disable IDE0035 + + Serilog.Log.Debug("InputMonitor {Event}", nameof(Bump)); + + var inputManager = new UnityInputManager(); + inputManager.ReadFromPath(inputManagerFilePath); + inputManager.SendData(); + + +#pragma warning restore CS0162 +#pragma warning restore IDE0035 + } + + } + + + public static partial class Extensions + { + public static string GetInfo(this List axes, string? name) + { + if (name == null || string.IsNullOrEmpty(name)) + return string.Empty; + + //axis.descriptiveName + var axesWithName = axes.Where(a => a.Name == name); + + int threshold = 80; + + var sb = new System.Text.StringBuilder(); + + foreach (var axis in axesWithName) + if (!string.IsNullOrEmpty(axis.descriptiveName)) + sb.Append($"{axis.descriptiveName} "); + + if (sb.Length > threshold) + return sb.ToString(); + + foreach (var axis in axesWithName) + if (!string.IsNullOrEmpty(axis.descriptiveNegativeName)) + sb.Append($"{axis.descriptiveNegativeName} "); + + if (sb.Length > threshold) + return sb.ToString(); + + foreach (var axis in axesWithName) + if (!string.IsNullOrEmpty(axis.positiveButton)) + sb.Append($"[{axis.positiveButton}] "); + + if (sb.Length > threshold) + return sb.ToString(); + + foreach (var axis in axesWithName) + if (!string.IsNullOrEmpty(axis.altPositiveButton)) + sb.Append($"{{{axis.altPositiveButton}}} "); + + if (sb.Length > threshold) + return sb.ToString(); + + foreach (var axis in axesWithName) + if (!string.IsNullOrEmpty(axis.negativeButton)) + sb.Append($"-[{axis.negativeButton}] "); + + if (sb.Length > threshold) + return sb.ToString(); + + foreach (var axis in axesWithName) + if (!string.IsNullOrEmpty(axis.altNegativeButton)) + sb.Append($"-{{{axis.altNegativeButton}}} "); + + return sb.ToString(); + } + } + +} diff --git a/Assets/Plugins/CodeAssist/Editor/Input/InputManagerMonitor.cs.meta b/Assets/Plugins/CodeAssist/Editor/Input/InputManagerMonitor.cs.meta new file mode 100644 index 00000000..8194e670 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Input/InputManagerMonitor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ab2b94a04ca32e6408302e2c842c945d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/Input/Text2Yaml.cs b/Assets/Plugins/CodeAssist/Editor/Input/Text2Yaml.cs new file mode 100644 index 00000000..da2f8712 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Input/Text2Yaml.cs @@ -0,0 +1,215 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +#pragma warning restore IDE0005 + + +#nullable enable + + +namespace Meryel.UnityCodeAssist.Editor.Input +{ + + public class Text2Yaml + { + public static string Convert(IEnumerable textLines) + { + var sb = new StringBuilder(); + var stack = new Stack<(string typeName, string identifier, int indentation)>(); + + sb.AppendLine(@"%YAML 1.1"); + sb.AppendLine(@"%TAG !u! tag:unity3d.com,2011:"); + sb.AppendLine(@"--- !u!13 &1"); + sb.AppendLine(@"InputManager:"); + + var regexIndentation = new Regex("^\\s*"); + + var regexString = new Regex("^(\\s+)(\\w+)\\s+\"([a-zA-Z0-9_ ]*)\"\\s+\\(string\\)$"); + var regexValue = new Regex("^(\\s+)(\\w+)\\s+(-?[0-9.]*)\\s+\\(((bool)|(int)|(float)|(unsigned int))\\)$"); + var regexType = new Regex("^(\\s+)(\\w+)\\s+\\((\\w+)\\)$"); + + var regexVectorSize = new Regex("(\\s+)size\\s+(\\d)+\\s+\\(int\\)"); + //var regexVectorData = new Regex("(\\s+)data \\(InputAxis\\)"); // remove InputAxis to make it more generic + + string curTextLine; + var curTextLineNo = 3; + var textIndentation = 1; + var indentationPrefix = new string(' ', textIndentation * 2); + stack.Push(("InputManager", "InputManager", textIndentation)); + + + foreach (var line in textLines.Skip(4)) + { + curTextLine = line; + curTextLineNo++; + + + // Skip empty lines + if (line.Length == 0) + continue; + + // Check if type undeclared, scope goes down, indentation decrements + { + var indentationMatch = regexIndentation.Match(line); + if (indentationMatch.Success) + { + var indentation = indentationMatch.Groups[0].Value.Length; + + if (indentation > textIndentation) + Error($"indentation({indentation}) > textIndentation({textIndentation})"); + + while (indentation < textIndentation) + { + stack.Pop(); + textIndentation--; + var typeIndentation = textIndentation; + if (stack.TryPeek(out var curType2)) + typeIndentation = curType2.indentation; + else if (line.Length > 0) + Error("stack empty at type undeclaration"); + indentationPrefix = new string(' ', typeIndentation * 2); + } + + } + else + { + Error($"{nameof(regexIndentation)} failed"); + } + } + + // Skip size field of vectors + if (stack.TryPeek(out var curType1) && curType1.typeName == "vector") + { + var vectorSizeMatch = regexVectorSize.Match(line); + if (vectorSizeMatch.Success) + { + continue; + } + } + + // Read string fields + { + var stringMatch = regexString.Match(line); + if (stringMatch.Success) + { + AddLine(stringMatch.Groups[2] + ": " + stringMatch.Groups[3]); + continue; + } + } + + // Read bool/int/float/unsignedInt fields + { + var valueMatch = regexValue.Match(line); + if (valueMatch.Success) + { + AddLine(valueMatch.Groups[2] + ": " + valueMatch.Groups[3]); + continue; + } + } + + // Check if new type declared, scope goes up, indentation increases + { + var typeMatch = regexType.Match(line); + if (typeMatch.Success) + { + var identifier = typeMatch.Groups[2].Value; + var typeName = typeMatch.Groups[3].Value; + + var isVectorData = false; + if (stack.TryPeek(out var curType2) && curType2.typeName == "vector" && identifier == "data") + isVectorData = true; + + var typeIndentation = textIndentation; + if (stack.TryPeek(out var curType3)) + typeIndentation = curType3.indentation; + else if (line.Length > 0) + Error("stack empty at type declaration"); + + if (!isVectorData) + { + AddLine(typeMatch.Groups[2] + ":"); + } + else + { + var customIndentation = typeIndentation - 1; + if (customIndentation < 0) + Error($"customIndentation({customIndentation}) < 0"); + var customIndentationPrefix = new string(' ', customIndentation * 2); + AddLine("- serializedVersion: 3", customIndentationPrefix); + } + + + textIndentation++; + typeIndentation++; + + if (isVectorData) + typeIndentation--; + + stack.Push((typeName, identifier, typeIndentation)); + indentationPrefix = new string(' ', typeIndentation * 2); + + continue; + } + } + + + Error("line failed to match all cases"); + + } + + + + return sb.ToString(); + + + void AddLine(string line, string? customIndentationPrefix = null) + { + string suffix; + if (stack.TryPeek(out var top)) + suffix = $" # {textIndentation}, {top.indentation}, {top.typeName} {top.identifier}"; + else + suffix = $" # {textIndentation}, nil"; + + if (customIndentationPrefix != null) + sb.AppendLine(customIndentationPrefix + line + suffix); + else + sb.AppendLine(indentationPrefix + line + suffix); + } + + void Error(string message) + { + var errorMessage = $"Text2Yaml error '{message}' at lineNo: {curTextLineNo}, line: '{curTextLine}' at {Environment.StackTrace}"; + //throw new Exception(errorMessage); + Serilog.Log.Warning(errorMessage); + } + + } + + + } + + public static partial class Extensions + { + public static bool TryPeek(this Stack stack, /*[MaybeNullWhen(false)]*/ out T result) + { + if (stack.Count > 0) + { + result = stack.Peek(); + return true; + } + else + { + result = default!; + return false; + } + } + } + +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/Input/Text2Yaml.cs.meta b/Assets/Plugins/CodeAssist/Editor/Input/Text2Yaml.cs.meta new file mode 100644 index 00000000..f77f3d9f --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Input/Text2Yaml.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 125ef4d78d8f77342bbc8d615313dea2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/Input/UnityInputManager.cs b/Assets/Plugins/CodeAssist/Editor/Input/UnityInputManager.cs new file mode 100644 index 00000000..aa5d0f7d --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Input/UnityInputManager.cs @@ -0,0 +1,411 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Linq; +using System.Security.Cryptography; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +using YamlDotNet = Meryel.UnityCodeAssist.YamlDotNet; +#pragma warning restore IDE0005 + + +#nullable enable + + +namespace Meryel.UnityCodeAssist.Editor.Input +{ + + + internal class UnityInputManager + { + //string yamlPath; + TextReader? reader; + InputManager? inputManager; + + public void ReadFromText(string text) + { + reader = new StringReader(text); + ReadAux(false, out _); + } + + public void ReadFromPath(string yamlPath) + { + + switch (UnityEditor.EditorSettings.serializationMode) + { + case UnityEditor.SerializationMode.ForceText: + { + reader = new StreamReader(yamlPath); + ReadAux(false, out _); + } + break; + + case UnityEditor.SerializationMode.ForceBinary: + { + // this approach will work for InputManager since its file size is small and limited + // but in the future, we may need to switch to reading binary files for big files + // like this https://github.com/Unity-Technologies/UnityDataTools + // or this https://github.com/SeriousCache/UABE + var converted = GetOrCreateConvertedFile(yamlPath); + if (!File.Exists(converted)) + { + Serilog.Log.Warning("Temp file {TempFile} couldn't found for converted yaml input file. Auto Input Manager will not work!", converted); + return; + } + var rawLines = File.ReadLines(converted); + var yamlText = Text2Yaml.Convert(rawLines); + reader = new StringReader(yamlText); + ReadAux(false, out _); + } + break; + + case UnityEditor.SerializationMode.Mixed: + { + reader = new StreamReader(yamlPath); + ReadAux(true, out var hasSemanticError); + if (hasSemanticError) + { + var converted = GetOrCreateConvertedFile(yamlPath); + if (!File.Exists(converted)) + { + Serilog.Log.Warning("Temp file {TempFile} couldn't found for converted yaml input file. Auto Input Manager will not work!", converted); + return; + } + var rawLines = File.ReadLines(converted); + var yamlText = Text2Yaml.Convert(rawLines); + reader = new StringReader(yamlText); + ReadAux(false, out _); + } + } + break; + + } + } + + + void ReadAux(bool canHaveSemanticError, out bool hasSemanticError) + { + hasSemanticError = false; + + if (reader == null) + { + Serilog.Log.Warning($"{nameof(UnityInputManager)}.{nameof(reader)} is null"); + return; + } + + //var reader = new StreamReader(yamlPath); + var deserializer = new YamlDotNet.Serialization.DeserializerBuilder() + .WithTagMapping("tag:unity3d.com,2011:13", typeof(Class13Mapper)) + .IgnoreUnmatchedProperties() + .Build(); + //serializer.Settings.RegisterTagMapping("tag:unity3d.com,2011:13", typeof(Class13)); + //serializer.Settings.ComparerForKeySorting = null; + Class13Mapper? result; + try + { + result = deserializer.Deserialize(reader); + } + catch (YamlDotNet.Core.SemanticErrorException semanticErrorException) + { + Serilog.Log.Debug(semanticErrorException, "Couldn't parse InputManager.asset yaml file"); + if (!canHaveSemanticError) + Serilog.Log.Error(semanticErrorException, "Couldn't parse InputManager.asset yaml file unexpectedly"); + + hasSemanticError = true; + return; + } + finally + { + reader.Close(); + } + + var inputManagerMapper = result?.InputManager; + if (inputManagerMapper == null) + { + Serilog.Log.Warning($"{nameof(inputManagerMapper)} is null"); + return; + } + + inputManager = new InputManager(inputManagerMapper); + } + + + public void SendData() + { + if (inputManager == null) + return; + + var axisNames = inputManager.Axes.Select(a => a.Name!).Where(n => !string.IsNullOrEmpty(n)).Distinct().ToArray(); + var axisInfos = axisNames.Select(a => inputManager.Axes.GetInfo(a)).ToArray(); + if (!CreateBindingsMap(out var buttonKeys, out var buttonAxis)) + return; + + string[] joystickNames; + try + { + joystickNames = UnityEngine.Input.GetJoystickNames(); + } + catch (InvalidOperationException) + { + // Occurs if user have switched active Input handling to Input System package in Player Settings. + joystickNames = new string[0]; + } + + NetMQInitializer.Publisher?.SendInputManager(axisNames, axisInfos, buttonKeys, buttonAxis, joystickNames); + + /* + NetMQInitializer.Publisher?.SendInputManager( + inputManager.Axes.Select(a => a.Name).Distinct().ToArray(), + inputManager.Axes.Select(a => a.positiveButton).ToArray(), + inputManager.Axes.Select(a => a.negativeButton).ToArray(), + inputManager.Axes.Select(a => a.altPositiveButton).ToArray(), + inputManager.Axes.Select(a => a.altNegativeButton).ToArray(), + UnityEngine.Input.GetJoystickNames() + ); + */ + + } + + + bool CreateBindingsMap([System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out string[]? inputKeys, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out string[]? inputAxis) + { + if (inputManager == null) + { + inputKeys = null; + inputAxis = null; + return false; + } + + var dict = new Dictionary(); + + foreach (var axis in inputManager.Axes) + { + if (axis.altNegativeButton != null && !string.IsNullOrEmpty(axis.altNegativeButton)) + dict[axis.altNegativeButton] = axis.Name; + } + foreach (var axis in inputManager.Axes) + { + if (axis.negativeButton != null && !string.IsNullOrEmpty(axis.negativeButton)) + dict[axis.negativeButton] = axis.Name; + } + foreach (var axis in inputManager.Axes) + { + if (axis.altPositiveButton != null && !string.IsNullOrEmpty(axis.altPositiveButton)) + dict[axis.altPositiveButton] = axis.Name; + } + foreach (var axis in inputManager.Axes) + { + if (axis.positiveButton != null && !string.IsNullOrEmpty(axis.positiveButton)) + dict[axis.positiveButton] = axis.Name; + } + + var keys = new string[dict.Count]; + var values = new string[dict.Count]; + dict.Keys.CopyTo(keys, 0); + dict.Values.CopyTo(values, 0); + + inputKeys = keys; + inputAxis = values; + return true; + } + + + + static string GetOrCreateConvertedFile(string filePath) + { + var hash = GetMD5Hash(filePath); + var convertedPath = Path.Combine(Path.GetTempPath(), $"UCA_IM_{hash}.txt"); + + if (!File.Exists(convertedPath)) + { + Serilog.Log.Debug("Converting binary to text format of {File} to {Target}", filePath, convertedPath); + var converter = new Binary2TextExec(); + converter.Exec(filePath, convertedPath); + } + else + { + Serilog.Log.Debug("Converted file already exists at {Target}", convertedPath); + } + + return convertedPath; + } + + /// + /// Gets a hash of the file using MD5. + /// + /// + /// + public static string GetMD5Hash(string filePath) + { + using var md5 = new MD5CryptoServiceProvider(); + return GetHash(filePath, md5); + } + + /// + /// Gets a hash of the file using MD5. + /// + /// + /// + public static string GetMD5Hash(Stream s) + { + using var md5 = new MD5CryptoServiceProvider(); + return GetHash(s, md5); + } + + private static string GetHash(string filePath, HashAlgorithm hasher) + { + using var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + return GetHash(fs, hasher); + } + + private static string GetHash(Stream s, HashAlgorithm hasher) + { + var hash = hasher.ComputeHash(s); + var hashStr = Convert.ToBase64String(hash); + //return hashStr.TrimEnd('='); + var hashStrAlphaNumeric = System.Text.RegularExpressions.Regex.Replace(hashStr, "[^A-Za-z0-9]", ""); + return hashStrAlphaNumeric; + } + + } + + public enum AxisType + { + KeyOrMouseButton = 0, + MouseMovement = 1, + JoystickAxis = 2 + }; + +#pragma warning disable IDE1006 + + public class InputAxisMapper + { + public int serializedVersion { get; set; } + + public string? m_Name { get; set; } + public string? descriptiveName { get; set; } + public string? descriptiveNegativeName { get; set; } + public string? negativeButton { get; set; } + public string? positiveButton { get; set; } + public string? altNegativeButton { get; set; } + public string? altPositiveButton { get; set; } + + //public float gravity { get; set; } + //public float dead { get; set; } + //public float sensitivity { get; set; } + public string? gravity { get; set; } + public string? dead { get; set; } + public string? sensitivity { get; set; } + + //public bool snap { get; set; } + public int snap { get; set; } + //public bool invert { get; set; } + public int invert { get; set; } + + //public AxisType type { get; set; } + public int type { get; set; } + + public int axis { get; set; } + public int joyNum { get; set; } + } + + public class InputAxis + { + readonly InputAxisMapper map; + + public InputAxis(InputAxisMapper map) + { + this.map = map; + } + + public int SerializedVersion + { + get { return map.serializedVersion; } + set { map.serializedVersion = value; } + } + + public string? Name => map.m_Name; + public string? descriptiveName => map.descriptiveName; + public string? descriptiveNegativeName => map.descriptiveNegativeName; + public string? negativeButton => map.negativeButton; + public string? positiveButton => map.positiveButton; + public string? altNegativeButton => map.altNegativeButton; + public string? altPositiveButton => map.altPositiveButton; + + public float gravity => float.Parse(map.gravity);//**--format + public float dead => float.Parse(map.dead);//**--format + public float sensitivity => float.Parse(map.sensitivity);//**--format + + public bool snap => map.snap != 0; + public bool invert => map.invert != 0; + + public AxisType type => (AxisType)map.type; + + public int axis => map.axis; + public int joyNum => map.joyNum; + } + + public class InputManagerMapper + { + public int m_ObjectHideFlags { get; set; } + public int serializedVersion { get; set; } + public int m_UsePhysicalKeys { get; set; } + public List? m_Axes { get; set; } + } + +#pragma warning restore IDE1006 + + public class InputManager + { + readonly InputManagerMapper map; + readonly List axes; + + public InputManager(InputManagerMapper map) + { + this.map = map; + this.axes = new List(); + + if (map.m_Axes == null) + { + Serilog.Log.Warning($"map.m_Axes is null"); + return; + } + + foreach (var a in map.m_Axes) + this.axes.Add(new InputAxis(a)); + } + + public int ObjectHideFlags + { + get { return map.m_ObjectHideFlags; } + set { map.m_ObjectHideFlags = value; } + } + + public int SerializedVersion + { + get { return map.serializedVersion; } + set { map.serializedVersion = value; } + } + + public bool UsePhysicalKeys + { + get { return map.m_UsePhysicalKeys != 0; } + set { map.m_UsePhysicalKeys = value ? 1 : 0; } + } + + /*public List Axes + { + get { return map.m_Axes; } + set { map.m_Axes = value; } + }*/ + public List Axes => axes; + } + + public class Class13Mapper + { + public InputManagerMapper? InputManager { get; set; } + } +} diff --git a/Assets/Plugins/CodeAssist/Editor/Input/UnityInputManager.cs.meta b/Assets/Plugins/CodeAssist/Editor/Input/UnityInputManager.cs.meta new file mode 100644 index 00000000..432b61ac --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Input/UnityInputManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9f8e747b934070646a5e222e85596865 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/LazyInitializer.cs b/Assets/Plugins/CodeAssist/Editor/LazyInitializer.cs new file mode 100644 index 00000000..c7fdd897 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/LazyInitializer.cs @@ -0,0 +1,47 @@ +using System.Collections; +using System.Collections.Generic; +using System.Collections.Concurrent; +using UnityEngine; +using UnityEditor; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +#pragma warning restore IDE0005 + + +#nullable enable + + +namespace Meryel.UnityCodeAssist.Editor +{ + + [InitializeOnLoad] + public static class LazyInitializer + { + static int counter; + + static LazyInitializer() + { + counter = -5;// start initializing five frames later + EditorApplication.update += OnUpdate; + } + + static void OnUpdate() + { + counter++; + + if (counter == 1) + MainThreadDispatcher.Bump(); + else if (counter == 2) + Logger.ELogger.Bump(); + else if (counter == 3) + Monitor.Bump(); + else if (counter == 4) + NetMQInitializer.Bump(); + else if(counter >= 5) + EditorApplication.update -= OnUpdate; + } + + } +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/LazyInitializer.cs.meta b/Assets/Plugins/CodeAssist/Editor/LazyInitializer.cs.meta new file mode 100644 index 00000000..5ba8d9df --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/LazyInitializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f33fd799071e17e4b903a03bbb6c59a3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/Logger.meta b/Assets/Plugins/CodeAssist/Editor/Logger.meta new file mode 100644 index 00000000..60225788 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Logger.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 67ecc40236b24224dafe897e8d436520 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/Logger/Attributes.cs b/Assets/Plugins/CodeAssist/Editor/Logger/Attributes.cs new file mode 100644 index 00000000..ba5e71b4 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Logger/Attributes.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Text; + +#if !NET_UNITY_4_8 +namespace System.Diagnostics.CodeAnalysis +{ + /// Specifies that when a method returns , the parameter will not be null even if the corresponding type allows it. + [AttributeUsage(AttributeTargets.Parameter, Inherited = false)] + internal sealed class NotNullWhenAttribute : Attribute + { + /// Initializes the attribute with the specified return value condition. + /// + /// The return value condition. If the method returns this value, the associated parameter will not be null. + /// + public NotNullWhenAttribute(bool returnValue) => ReturnValue = returnValue; + + /// Gets the return value condition. + public bool ReturnValue { get; } + } +} +#endif \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/Logger/Attributes.cs.meta b/Assets/Plugins/CodeAssist/Editor/Logger/Attributes.cs.meta new file mode 100644 index 00000000..dc843469 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Logger/Attributes.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3413057961ba0294e8dd57a20b0985b9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/Logger/CommonTools.cs b/Assets/Plugins/CodeAssist/Editor/Logger/CommonTools.cs new file mode 100644 index 00000000..648fff22 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Logger/CommonTools.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using static System.IO.Path; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +#pragma warning restore IDE0005 + + +#nullable enable + + +namespace Meryel.UnityCodeAssist.Editor +{ + public static class CommonTools + { + public static string GetTagManagerFilePath() + { + var projectPath = GetProjectPathRaw(); + var tagManagerPath = Combine(projectPath, "ProjectSettings/TagManager.asset"); + return tagManagerPath; + } + + public static string GetInputManagerFilePath() + { + var projectPath = GetProjectPathRaw(); + var inputManagerPath = Combine(projectPath, "ProjectSettings/InputManager.asset"); + return inputManagerPath; + } + + public static string GetProjectPath() + { + var rawPath = GetProjectPathRaw(); + var osPath = new OSPath(rawPath); + var unixPath = osPath.Unix; + var trimmed = unixPath.TrimEnd('\\', '/'); + return trimmed; + } + + /// + /// Get the path to the project folder. + /// + /// The project folder path + static string GetProjectPathRaw() + { + // Application.dataPath returns the path including /Assets, which we need to strip off + var path = UnityEngine.Application.dataPath; + var directory = new DirectoryInfo(path); + var parent = directory.Parent; + if (parent != null) + return parent.FullName; + + return path; + } + + public static int GetHashOfPath(string path) + { + var osPath = new OSPath(path); + var unixPath = osPath.Unix; + var trimmed = unixPath.TrimEnd('\\', '/'); + var hash = trimmed.GetHashCode(); + + if (hash < 0) // Get rid of the negative values, so there will be no '-' char in file names + { + hash++; + hash = Math.Abs(hash); + } + + return hash; + } + } + + // https://github.com/dmitrynogin/cdsf/blob/master/Cds.Folders/OSPath.cs + internal class OSPath + { + public static readonly OSPath Empty = ""; + + public static bool IsWindows => DirectorySeparatorChar == '\\'; + + public OSPath(string text) + { + Text = text.Trim(); + } + + public static implicit operator OSPath(string text) => new OSPath(text); + public static implicit operator string(OSPath path) => path.Normalized; + public override string ToString() => Normalized; + + protected string Text { get; } + + public string Normalized => IsWindows ? Windows : Unix; + public string Windows => Text.Replace('/', '\\'); + //public string Unix => Simplified.Text.Replace('\\', '/'); + public string Unix => Text.Replace('\\', '/'); + + public OSPath Relative => Simplified.Text.TrimStart('/', '\\'); + public OSPath Absolute => IsAbsolute ? this : "/" + Relative; + + public bool IsAbsolute => IsRooted || HasVolume; + public bool IsRooted => Text.Length >= 1 && (Text[0] == '/' || Text[0] == '\\'); + public bool HasVolume => Text.Length >= 2 && Text[1] == ':'; + public OSPath Simplified => HasVolume ? Text.Substring(2) : Text; + + public OSPath Parent => GetDirectoryName(Text); + + public bool Contains(OSPath path) => + Normalized.StartsWith(path); + + public static OSPath operator +(OSPath left, OSPath right) => + new OSPath(Combine(left, right.Relative)); + + public static OSPath operator -(OSPath left, OSPath right) => + left.Contains(right) + ? new OSPath(left.Normalized.Substring(right.Normalized.Length)).Relative + : left; + } +} diff --git a/Assets/Plugins/CodeAssist/Editor/Logger/CommonTools.cs.meta b/Assets/Plugins/CodeAssist/Editor/Logger/CommonTools.cs.meta new file mode 100644 index 00000000..9720fcaa --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Logger/CommonTools.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c9ed689daaaf3684abdb23a1b46a2767 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/Logger/DomainHashEnricher.cs b/Assets/Plugins/CodeAssist/Editor/Logger/DomainHashEnricher.cs new file mode 100644 index 00000000..9fb5a0c2 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Logger/DomainHashEnricher.cs @@ -0,0 +1,36 @@ +using System; +using System.Linq; +using Meryel.UnityCodeAssist.Serilog; +using Meryel.UnityCodeAssist.Serilog.Core; +using Meryel.UnityCodeAssist.Serilog.Events; +using Meryel.UnityCodeAssist.Serilog.Configuration; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +#pragma warning restore IDE0005 + + +#nullable enable + + +namespace Meryel.UnityCodeAssist.Editor.Logger +{ + public class DomainHashEnricher : ILogEventEnricher + { + static readonly int domainHash; + + static DomainHashEnricher() + { + var guid = UnityEditor.GUID.Generate(); + domainHash = guid.GetHashCode(); + } + + public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) + { + logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty( + "DomainHash", domainHash)); + } + } + +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/Logger/DomainHashEnricher.cs.meta b/Assets/Plugins/CodeAssist/Editor/Logger/DomainHashEnricher.cs.meta new file mode 100644 index 00000000..14342dfe --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Logger/DomainHashEnricher.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a3bf8ac8011a96247ad719c114982725 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/Logger/ELogger.cs b/Assets/Plugins/CodeAssist/Editor/Logger/ELogger.cs new file mode 100644 index 00000000..4835ef0d --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Logger/ELogger.cs @@ -0,0 +1,199 @@ +using Meryel.UnityCodeAssist.Serilog; +using Meryel.UnityCodeAssist.Serilog.Core; +using UnityEngine; +using UnityEditor; +using System.Linq; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +#pragma warning restore IDE0005 + + +#nullable enable + + +namespace Meryel.UnityCodeAssist.Editor.Logger +{ + + //[InitializeOnLoad] + public static class ELogger + { + public static event System.Action? OnVsInternalLogChanged; + + + // Change 'new LoggerConfiguration().MinimumLevel.Debug();' if you change these values + const Serilog.Events.LogEventLevel fileMinLevel = Serilog.Events.LogEventLevel.Debug; + const Serilog.Events.LogEventLevel outputWindowMinLevel = Serilog.Events.LogEventLevel.Information; + static LoggingLevelSwitch? fileLevelSwitch, outputWindowLevelSwitch; + + //static bool IsInitialized { get; set; } + + static ILogEventSink? _outputWindowSink; + static ILogEventSink? _memorySink; + + + public static string GetInternalLogContent() => _memorySink == null ? string.Empty : ((MemorySink)_memorySink).Export(); + public static int GetErrorCountInInternalLog() => _memorySink == null ? 0 : ((MemorySink)_memorySink).ErrorCount; + public static int GetWarningCountInInternalLog() => _memorySink == null ? 0 : ((MemorySink)_memorySink).WarningCount; + + public static string? FilePath { get; private set; } + public static string? VSFilePath { get; private set; } + + //**-- make it work with multiple clients + static string? _vsInternalLog; + public static string? VsInternalLog + { + get => _vsInternalLog; + set + { + _vsInternalLog = value; + OnVsInternalLogChanged?.Invoke(); + } + } + + + + static ELogger() + { + var isFirst = false; + const string stateName = "isFirst"; + if (!SessionState.GetBool(stateName, false)) + { + isFirst = true; + SessionState.SetBool(stateName, true); + } + + var projectPath = CommonTools.GetProjectPath(); + var outputWindowSink = new System.Lazy(() => new UnityOutputWindowSink(null)); + + Init(isFirst, projectPath, outputWindowSink); + + if (isFirst) + LogHeader(Application.unityVersion, projectPath); + } + + /// + /// Empty method for invoking static class ctor + /// + public static void Bump() { } + + + static void LogHeader(string unityVersion, string solutionDir) + { + var os = System.Runtime.InteropServices.RuntimeInformation.OSDescription; + var assisterVersion = Assister.Version; + var syncModel = Synchronizer.Model.Utilities.Version; + var hash = CommonTools.GetHashOfPath(solutionDir); + Serilog.Log.Debug( + "Beginning logging {OS}, Unity {U}, Unity Code Assist {A}, Communication Protocol {SM}, Project: '{Dir}', Project Hash: {Hash}", + os, unityVersion, assisterVersion, syncModel, solutionDir, hash); + } + + + + + + + + static string GetFilePath(string solutionDir) + { + var solutionHash = CommonTools.GetHashOfPath(solutionDir); + var tempDir = System.IO.Path.GetTempPath(); + var fileName = $"UnityCodeAssist_U_Log_{solutionHash}_.TXT"; // hour code will be appended to the end of file, so add a trailing '_' + var filePath = System.IO.Path.Combine(tempDir, fileName); + return filePath; + } + + static string GetVSFilePath(string solutionDir) + { + var solutionHash = CommonTools.GetHashOfPath(solutionDir); + var tempDir = System.IO.Path.GetTempPath(); +#if MERYEL_UCA_LITE_VERSION + var fileName = $"UnityCodeAssistLite_VS_Log_{solutionHash}_.TXT"; // hour code will be appended to the end of file, so add a trailing '_' +#else + var fileName = $"UnityCodeAssist_VS_Log_{solutionHash}_.TXT"; // hour code will be appended to the end of file, so add a trailing '_' +#endif + var filePath = System.IO.Path.Combine(tempDir, fileName); + return filePath; + } + + + public static void Init(bool isFirst, string solutionDir, System.Lazy outputWindowSink) + { + + FilePath = GetFilePath(solutionDir); + VSFilePath = GetVSFilePath(solutionDir); + + fileLevelSwitch = new LoggingLevelSwitch(fileMinLevel); + outputWindowLevelSwitch = new LoggingLevelSwitch(outputWindowMinLevel); + + var config = new LoggerConfiguration() + .MinimumLevel.Debug() + .Enrich.With(new DomainHashEnricher()); + + const string outputTemplate = "{Timestamp:HH:mm:ss.fff} [U] [{Level:u3}] [{DomainHash}] {Message:lj}{NewLine}{Exception}"; + + config = config.WriteTo.PersistentFile(FilePath + , outputTemplate: outputTemplate + , shared: true + , persistentFileRollingInterval: PersistentFileRollingInterval.Day + , preserveLogFilename: true + , levelSwitch: fileLevelSwitch + , rollOnEachProcessRun: isFirst + ); + + _outputWindowSink ??= outputWindowSink.Value; + if (_outputWindowSink != null) + config = config.WriteTo.Sink(_outputWindowSink, outputWindowMinLevel, outputWindowLevelSwitch); + + _memorySink ??= new MemorySink(outputTemplate); + config = config.WriteTo.Sink(_memorySink, fileMinLevel, null); + + config = config.Destructure.With(new MyDestructuringPolicy()); + + Serilog.Log.Logger = config.CreateLogger(); + //switchableLogger.Set(config.CreateLogger(), disposePrev: true); + + OnOptionsChanged(); + + //IsInitialized = true; + } + + public static void OnOptionsChanged() + { + // Since we don't use LogEventLevel.Fatal, we can use it for disabling sinks + + var isLoggingToFile = OptionsIsLoggingToFile; + var targetFileLevel = isLoggingToFile ? fileMinLevel : Serilog.Events.LogEventLevel.Fatal; + if (fileLevelSwitch != null) + fileLevelSwitch.MinimumLevel = targetFileLevel; + + var isLoggingToOutputWindow = OptionsIsLoggingToOutputWindow; + var targetOutputWindowLevel = isLoggingToOutputWindow ? outputWindowMinLevel : Serilog.Events.LogEventLevel.Fatal; + if (outputWindowLevelSwitch != null) + outputWindowLevelSwitch.MinimumLevel = targetOutputWindowLevel; + } + + //**-- UI for these two + static bool OptionsIsLoggingToFile => true; + static bool OptionsIsLoggingToOutputWindow => true; + } + + public class MyDestructuringPolicy : IDestructuringPolicy + { + // serilog cannot destruct StringArrayContainer by default, so do it manually + public bool TryDestructure(object value, ILogEventPropertyValueFactory propertyValueFactory, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out Serilog.Events.LogEventPropertyValue? result) + { + if (value is Synchronizer.Model.StringArrayContainer sac) + { + var items = sac.Container.Select(item => propertyValueFactory.CreatePropertyValue(item, true)); + result = new Serilog.Events.SequenceValue(items); + return true; + } + + result = null; + return false; + } + } +} diff --git a/Assets/Plugins/CodeAssist/Editor/Logger/ELogger.cs.meta b/Assets/Plugins/CodeAssist/Editor/Logger/ELogger.cs.meta new file mode 100644 index 00000000..b80d498c --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Logger/ELogger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 65ad376d3b47e054f93a7e6d663d1b7e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/Logger/MemorySink.cs b/Assets/Plugins/CodeAssist/Editor/Logger/MemorySink.cs new file mode 100644 index 00000000..e03d2ca3 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Logger/MemorySink.cs @@ -0,0 +1,136 @@ +using System; +using System.Collections.Concurrent; +using System.IO; +using System.Text; +using Meryel.UnityCodeAssist.Serilog.Core; +using Meryel.UnityCodeAssist.Serilog.Events; +using Meryel.UnityCodeAssist.Serilog.Formatting; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +#pragma warning restore IDE0005 + + +#nullable enable + + +namespace Meryel.UnityCodeAssist.Editor.Logger +{ + //**-- + // remove this in unity??? + // need to serialize/deserialize data to survive domain reload, which will effect performance + // right now data is lost during domain reloads, which makes its function kinda useless + // or maybe move it to a external process like com.unity.process-server + public class MemorySink : ILogEventSink + { + readonly ConcurrentQueue logs; + readonly ConcurrentQueue warningLogs; + readonly ConcurrentQueue errorLogs; + + const int logsLimit = 30; + const int warningLimit = 5; + const int errorLimit = 3; + + readonly string outputTemplate; + + public MemorySink(string outputTemplate) + { + this.outputTemplate = outputTemplate; + + logs = new ConcurrentQueue(); + warningLogs = new ConcurrentQueue(); + errorLogs = new ConcurrentQueue(); + } + + public void Emit(LogEvent logEvent) + { + if (logEvent == null) + return; + + logs.Enqueue(logEvent); + if (logs.Count > logsLimit) + logs.TryDequeue(out _); + + if (logEvent.Level == LogEventLevel.Warning) + { + var warningAndLeadingLogs = logs.ToArray(); + warningLogs.Enqueue(warningAndLeadingLogs); + if (warningLogs.Count > warningLimit) + warningLogs.TryDequeue(out _); + } + + if (logEvent.Level == LogEventLevel.Error) + { + var errorAndLeadingLogs = logs.ToArray(); + errorLogs.Enqueue(errorAndLeadingLogs); + if (errorLogs.Count > errorLimit) + errorLogs.TryDequeue(out _); + } + } + + public bool HasError => !errorLogs.IsEmpty; + public bool HasWarning => !warningLogs.IsEmpty; + public int ErrorCount => errorLogs.Count; + public int WarningCount => warningLogs.Count; + + public string Export() + { + IFormatProvider? formatProvider = null; + var formatter = new Serilog.Formatting.Display.MessageTemplateTextFormatter( + outputTemplate, formatProvider); + + var result = string.Empty; + + using (var outputStream = new MemoryStream()) + { + var encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false); + using var output = new StreamWriter(outputStream, encoding); + if (!errorLogs.IsEmpty) + { + var errorArray = errorLogs.ToArray(); + foreach (var error in errorArray) + { + foreach (var logEvent in error) + { + formatter.Format(logEvent, output); + } + } + } + + if (!warningLogs.IsEmpty) + { + var warningArray = warningLogs.ToArray(); + foreach (var warning in warningArray) + { + foreach (var logEvent in warning) + { + formatter.Format(logEvent, output); + } + } + } + + if (!logs.IsEmpty) + { + var logArray = logs.ToArray(); + foreach (var logEvent in logArray) + { + formatter.Format(logEvent, output); + } + } + + output.Flush(); + + outputStream.Seek(0, SeekOrigin.Begin); + using var streamReader = new StreamReader(outputStream, encoding); + result = streamReader.ReadToEnd(); + + + } + + return result; + } + + + } +} diff --git a/Assets/Plugins/CodeAssist/Editor/Logger/MemorySink.cs.meta b/Assets/Plugins/CodeAssist/Editor/Logger/MemorySink.cs.meta new file mode 100644 index 00000000..41f38e1f --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Logger/MemorySink.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d302ac255c194bf4bb566f02254692cd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/Logger/UnitySink.cs b/Assets/Plugins/CodeAssist/Editor/Logger/UnitySink.cs new file mode 100644 index 00000000..49ace1fa --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Logger/UnitySink.cs @@ -0,0 +1,52 @@ +using System; +using System.Linq; +using Meryel.UnityCodeAssist.Serilog; +using Meryel.UnityCodeAssist.Serilog.Core; +using Meryel.UnityCodeAssist.Serilog.Events; +using Meryel.UnityCodeAssist.Serilog.Configuration; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +#pragma warning restore IDE0005 + + +#nullable enable + + +namespace Meryel.UnityCodeAssist.Editor.Logger +{ + public class UnityOutputWindowSink : ILogEventSink + { + private readonly IFormatProvider? _formatProvider; + + public UnityOutputWindowSink(IFormatProvider? formatProvider) + { + _formatProvider = formatProvider; + } + + public void Emit(LogEvent logEvent) + { + var message = logEvent.RenderMessage(_formatProvider); + + switch (logEvent.Level) + { + case LogEventLevel.Verbose: + case LogEventLevel.Debug: + case LogEventLevel.Information: + UnityEngine.Debug.Log(message); + break; + case LogEventLevel.Warning: + UnityEngine.Debug.LogWarning(message); + break; + case LogEventLevel.Error: + case LogEventLevel.Fatal: + UnityEngine.Debug.LogError(message); + break; + default: + break; + } + } + } + +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/Logger/UnitySink.cs.meta b/Assets/Plugins/CodeAssist/Editor/Logger/UnitySink.cs.meta new file mode 100644 index 00000000..1226e449 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Logger/UnitySink.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1111cd3d56077e7418aeaf0d28bd936f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/MainThreadDispatcher.cs b/Assets/Plugins/CodeAssist/Editor/MainThreadDispatcher.cs new file mode 100644 index 00000000..6cb36e0c --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/MainThreadDispatcher.cs @@ -0,0 +1,45 @@ +using System.Collections; +using System.Collections.Generic; +using System.Collections.Concurrent; +using UnityEngine; +using UnityEditor; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +#pragma warning restore IDE0005 + + +#nullable enable + + +namespace Meryel.UnityCodeAssist.Editor +{ + + //[InitializeOnLoad] + public static class MainThreadDispatcher + { + readonly static ConcurrentBag actions; + + static MainThreadDispatcher() + { + actions = new ConcurrentBag(); + EditorApplication.update += Update; + } + + /// + /// Empty method for invoking static class ctor + /// + public static void Bump() {} + + static void Update() + { + while (actions.TryTake(out var action)) + { + action.Invoke(); + } + } + + public static void Add(System.Action action) => actions.Add(action); + } +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/MainThreadDispatcher.cs.meta b/Assets/Plugins/CodeAssist/Editor/MainThreadDispatcher.cs.meta new file mode 100644 index 00000000..6daecdc6 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/MainThreadDispatcher.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c2baa939e5ee68b4b9fa2f4c6ea426ff +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/Monitor.cs b/Assets/Plugins/CodeAssist/Editor/Monitor.cs new file mode 100644 index 00000000..ff3ba053 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Monitor.cs @@ -0,0 +1,266 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEditor; +using UnityEditor.SceneManagement; +using UnityEngine.SceneManagement; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +#pragma warning restore IDE0005 + + +#nullable enable + + +namespace Meryel.UnityCodeAssist.Editor +{ + + //[InitializeOnLoad] + public static class Monitor + { + private readonly static string tagManagerFilePath; + private static System.DateTime previousTagManagerLastWrite; + + private static bool isAppFocused; + private static bool isAppFocusedOnTagManager; + + private static int dirtyCounter; + private static readonly Dictionary dirtyDict; + + static Monitor() + { + tagManagerFilePath = CommonTools.GetTagManagerFilePath(); + try + { + previousTagManagerLastWrite = System.IO.File.GetLastWriteTime(tagManagerFilePath); + } + catch (System.Exception ex) + { + Serilog.Log.Debug(ex, "Exception at {Location}", nameof(System.IO.File.GetLastWriteTime)); + } + dirtyDict = new Dictionary(); + dirtyCounter = 0; + + EditorApplication.hierarchyChanged += OnHierarchyChanged; + EditorApplication.update += OnUpdate; + Undo.postprocessModifications += MyPostprocessModificationsCallback; + //Undo.undoRedoPerformed += MyUndoCallback; + Selection.selectionChanged += OnSelectionChanged; + //EditorSceneManager.sceneOpened += EditorSceneManager_sceneOpened; + EditorSceneManager.activeSceneChangedInEditMode += EditorSceneManager_activeSceneChangedInEditMode; + + Application.logMessageReceived += Application_logMessageReceived; + //System.Threading.Tasks.TaskScheduler.UnobservedTaskException += + } + + /// + /// Empty method for invoking static class ctor + /// + public static void Bump() { } + + private static void EditorSceneManager_activeSceneChangedInEditMode(Scene arg0, Scene arg1) + { + //Debug.Log("EditorSceneManager_activeSceneChangedInEditMode"); + OnHierarchyChanged(); + } + + private static void EditorSceneManager_sceneOpened(Scene scene, OpenSceneMode mode) + { + Serilog.Log.Debug("Monitor {Event} scene:{Scene} mode:{Mode}", nameof(EditorSceneManager_sceneOpened), scene.name, mode); + //Debug.Log("EditorSceneManager_sceneOpened"); + OnHierarchyChanged(); + } + + static void OnUpdate() + { + string? currentEditorFocus = null; + if (Selection.activeObject) + currentEditorFocus = Selection.activeObject.GetType().ToString(); + + var currentTagManagerLastWrite = previousTagManagerLastWrite; + try + { + currentTagManagerLastWrite = System.IO.File.GetLastWriteTime(tagManagerFilePath); + } + catch (System.Exception ex) + { + Serilog.Log.Debug(ex, "Exception at {Location}", nameof(System.IO.File.GetLastWriteTime)); + } + if (currentTagManagerLastWrite != previousTagManagerLastWrite) + { + previousTagManagerLastWrite = currentTagManagerLastWrite; + OnTagsOrLayersModified(); + } + else if (currentEditorFocus == "UnityEditor.TagManager") + { + // since unity does not commit changes to the file immediately, checking if user is displaying and focusing on tag manager (tags & layers) inspector + isAppFocusedOnTagManager = true; + } + + + if (isAppFocused != UnityEditorInternal.InternalEditorUtility.isApplicationActive) + { + isAppFocused = UnityEditorInternal.InternalEditorUtility.isApplicationActive; + OnOnUnityEditorFocusChanged(isAppFocused); + //Serilog.Log.Debug("On focus {State}", isAppFocused); + } + } + + static void OnTagsOrLayersModified() + { + Serilog.Log.Debug("Monitor {Event}", nameof(OnTagsOrLayersModified)); + + Assister.SendTagsAndLayers(); + } + + static void OnHierarchyChanged() + { + Serilog.Log.Debug("Monitor {Event}", nameof(OnHierarchyChanged)); + + // For requesting active doc's GO + NetMQInitializer.Publisher?.SendHandshake(); + + if (ScriptFinder.GetActiveGameObject(out var activeGO)) + NetMQInitializer.Publisher?.SendGameObject(activeGO); + //Assister.SendTagsAndLayers(); Don't send tags & layers here + } + + static UndoPropertyModification[] MyPostprocessModificationsCallback(UndoPropertyModification[] modifications) + { + Serilog.Log.Debug("Monitor {Event}", nameof(MyPostprocessModificationsCallback)); + + foreach (var modification in modifications) + { + var target = modification.currentValue?.target; + SetDirty(target); + } + + // here, you can perform processing of the recorded modifications before returning them + return modifications; + } + + //static void MyUndoCallback() + //{ + // Serilog.Log.Debug("Monitor {Event}", nameof(MyUndoCallback)); + // // code for the action to take on Undo + //} + + static void OnOnUnityEditorFocusChanged(bool isFocused) + { + if (!isFocused) + { + if (isAppFocusedOnTagManager) + { + isAppFocusedOnTagManager = false; + OnTagsOrLayersModified(); + } + + OnSelectionChanged(); + FlushAllDirty(); + /* + Serilog.Log.Debug("exporting {Count} objects", selectedObjects.Count); + + //**--if too many + foreach (var obj in selectedObjects) + { + if (obj is GameObject go) + NetMQInitializer.Publisher.SendGameObject(go); + } + + selectedObjects.Clear(); + */ + } + } + + static void OnSelectionChanged() + { + + //**--check order, last selected should be sent last as well + //**--limit here, what if too many? + //selectedObjects.UnionWith(Selection.objects); + foreach(var so in Selection.objects) + { + SetDirty(so); + } + } + + public static void SetDirty(Object? obj) + { + if (obj == null) + return; + else if (obj is GameObject go && go) + SetDirty(go); + else if (obj is Component component && component) + //SetDirty(component.gameObject); + { + var componentGo = component.gameObject; + if (componentGo) + SetDirty(componentGo); + } + //else + //;//**--scriptable obj + } + + public static void SetDirty(GameObject go) + { + dirtyCounter++; + dirtyDict[go] = dirtyCounter; + } + + static void FlushAllDirty() + { + // Sending order is important, must send them in the same order as they are added to/modified in the collection + // Using dict instead of hashset because of that. Dict value is used as add/modify order + + var sortedDict = from entry in dirtyDict orderby entry.Value descending select entry; + + foreach (var entry in sortedDict) + { + var go = entry.Key; + NetMQInitializer.Publisher?.SendGameObject(go); + } + + dirtyDict.Clear(); + dirtyCounter = 0; + } + + + private static void Application_logMessageReceived(string condition, string stackTrace, LogType type) + { + if (type != LogType.Exception && type != LogType.Error && type != LogType.Warning) + return; + + if (!stackTrace.Contains("Meryel.UnityCodeAssist.Editor")) + return; + + var typeStr = type.ToString(); + + NetMQInitializer.Publisher?.SendErrorReport(condition, stackTrace, typeStr); + } + + + public static void LazyLoad(string category) + { + if (category == "PlayerPrefs") + { + Preferences.PreferenceMonitor.InstanceOfPlayerPrefs.Bump(); + } + else if(category == "EditorPrefs") + { + Preferences.PreferenceMonitor.InstanceOfEditorPrefs.Bump(); + } + else if(category == "InputManager") + { + Input.InputManagerMonitor.Instance.Bump(); + } + else + { + Serilog.Log.Error("Invalid LazyLoad category {Category}", category); + } + } + } + +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/Monitor.cs.meta b/Assets/Plugins/CodeAssist/Editor/Monitor.cs.meta new file mode 100644 index 00000000..cbb326b0 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Monitor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2449e559cf32ffc4c8b373d360d15ce7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/NetMQInitializer.cs b/Assets/Plugins/CodeAssist/Editor/NetMQInitializer.cs new file mode 100644 index 00000000..849d1c89 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/NetMQInitializer.cs @@ -0,0 +1,140 @@ +using System; +using UnityEngine; +using UnityEditor; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +using NetMQ = Meryel.UnityCodeAssist.NetMQ; +#pragma warning restore IDE0005 + + +#nullable enable + + +namespace Meryel.UnityCodeAssist.Editor +{ + //[InitializeOnLoad] + public static class NetMQInitializer + { + public static NetMQPublisher? Publisher; + + static NetMQInitializer() + { + EditorApplication.quitting += EditorApplication_quitting; + AssemblyReloadEvents.beforeAssemblyReload += AssemblyReloadEvents_beforeAssemblyReload; + //AssemblyReloadEvents.afterAssemblyReload += AssemblyReloadEvents_afterAssemblyReload; + + RunOnceOnUpdate(Initialize); + } + + /// + /// Empty method for invoking static class ctor + /// + public static void Bump() { } + + /// + /// false for profiler standalone process + /// + /// + public static bool IsMainUnityEditorProcess() + { +#if UNITY_2020_2_OR_NEWER + if (UnityEditor.AssetDatabase.IsAssetImportWorkerProcess()) + return false; +#elif UNITY_2019_3_OR_NEWER + if (UnityEditor.Experimental.AssetDatabaseExperimental.IsAssetImportWorkerProcess()) + return false; +#endif + +#if UNITY_2021_1_OR_NEWER + if (UnityEditor.MPE.ProcessService.level == UnityEditor.MPE.ProcessLevel.Secondary) + return false; +#elif UNITY_2020_2_OR_NEWER + if (UnityEditor.MPE.ProcessService.level == UnityEditor.MPE.ProcessLevel.Slave) + return false; +#elif UNITY_2020_1_OR_NEWER + if (global::Unity.MPE.ProcessService.level == global::Unity.MPE.ProcessLevel.UMP_SLAVE) + return false; +#endif + + return true; + } + + public static void Initialize() + { + if (!IsMainUnityEditorProcess()) + { + // if try to creaate NetMQ, will recieve AddressAlreadyInUseException during binding + Serilog.Log.Debug("NetMQ won't initialize on secondary processes"); + return; + } + + Serilog.Log.Debug("NetMQ initializing"); + + AsyncIO.ForceDotNet.Force(); + + Serilog.Log.Debug("NetMQ cleaning up (true)"); + NetMQ.NetMQConfig.Cleanup(true); + + Serilog.Log.Debug("NetMQ constructing"); + Publisher = new NetMQPublisher(); + + RunOnShutdown(OnShutDown); + Serilog.Log.Debug("NetMQ initialized"); + } + + private static void OnShutDown() + { + Serilog.Log.Debug("NetMQ OnShutDown"); + Clear(); + } + + //private static void AssemblyReloadEvents_afterAssemblyReload() + //{ + // Serilog.Log.Debug("NetMQ AssemblyReloadEvents_afterAssemblyReload"); + //} + + private static void AssemblyReloadEvents_beforeAssemblyReload() + { + Serilog.Log.Debug("NetMQ AssemblyReloadEvents_beforeAssemblyReload"); + + Clear(); + } + + private static void EditorApplication_quitting() + { + Serilog.Log.Debug("NetMQ EditorApplication_quitting"); + + Publisher?.SendDisconnect(); + Clear(); + } + + static void Clear() => Publisher?.Clear(); + + + private static void RunOnceOnUpdate(Action action) + { + void callback() + { + EditorApplication.update -= callback; + action(); + } + + EditorApplication.update += callback; + } + + private static void RunOnShutdown(Action action) + { + // Mono on OSX has all kinds of quirks on AppDomain shutdown + //if (!VisualStudioEditor.IsWindows) + //return; +#if !UNITY_EDITOR_WIN + return; +#else + AppDomain.CurrentDomain.DomainUnload += (_, __) => action(); +#endif + + } + } +} diff --git a/Assets/Plugins/CodeAssist/Editor/NetMQInitializer.cs.meta b/Assets/Plugins/CodeAssist/Editor/NetMQInitializer.cs.meta new file mode 100644 index 00000000..83ef9722 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/NetMQInitializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2022b1c2052f06b4b893db6d6f26e2fb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/NetMQPublisher.cs b/Assets/Plugins/CodeAssist/Editor/NetMQPublisher.cs new file mode 100644 index 00000000..c406e528 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/NetMQPublisher.cs @@ -0,0 +1,798 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.IO; +using UnityEngine; +using UnityEditor; +using Meryel.UnityCodeAssist.NetMQ; +using Meryel.UnityCodeAssist.NetMQ.Sockets; +using System.Threading; +using Task = System.Threading.Tasks.Task; +//using CancellationToken = System.Threading; +using Application = UnityEngine.Application; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +using NetMQ = Meryel.UnityCodeAssist.NetMQ; +#pragma warning restore IDE0005 + + +#nullable enable + + +//**-- +// can also do this for better clear, sometimes it gets locked +// https://answers.unity.com/questions/704066/callback-before-unity-reloads-editor-assemblies.html# + +namespace Meryel.UnityCodeAssist.Editor +{ + public class NetMQPublisher : Synchronizer.Model.IProcessor + { + PublisherSocket? pubSocket; + readonly string pubConnString; + + Task? pullTask; + CancellationTokenSource? pullTaskCancellationTokenSource; + + readonly Synchronizer.Model.Manager syncMngr; + + public List clients; + + Synchronizer.Model.Connect? _self; + + Synchronizer.Model.Connect Self => _self!; + + void InitializeSelf() + { + var projectPath = CommonTools.GetProjectPath(); + _self = new Synchronizer.Model.Connect() + { + ModelVersion = Synchronizer.Model.Utilities.Version, + ProjectPath = projectPath, + ProjectName = getProjectName(), + ContactInfo = $"Unity {Application.unityVersion}", + AssemblyVersion = Assister.Version, + }; + + string getProjectName() + { + string[] s = projectPath.Split('/'); + string projectName = s[s.Length - 2]; + //Logg("project = " + projectName); + return projectName; + } + } + + + public static void LogContext() + { + Serilog.Log.Debug("LogginContext begin"); + + //var context = typeof(NetMQConfig).GetProperty("Context", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic).GetValue(null); + var context = typeof(NetMQConfig).GetField("s_ctx", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic).GetValue(null); + Serilog.Log.Debug("context: {Context}", context); + + if (context == null) + return; + + var starting = context.GetType().GetField("m_starting", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(context); + Serilog.Log.Debug("starting: {Starting}", starting); + + var terminating = context.GetType().GetField("m_terminating", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(context); + Serilog.Log.Debug("terminating: {Terminating}", terminating); + + var sockets = context.GetType().GetField("m_sockets", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(context); + //Logg("sockets:" + sockets); + //var socketList = sockets as System.Collections.IList; + if (sockets is System.Collections.IList socketList) + { + Serilog.Log.Debug("socketList: {SocketList} [{Count}]", socketList, socketList.Count); + + foreach (var socketItem in socketList) + { + Serilog.Log.Debug("socketItem: {SocketItem}", socketItem); + } + } + + var endPoints = context.GetType().GetField("m_endpoints", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(context); + //Logg("endPoints:" + endPoints); + //var endPointDict = endPoints as System.Collections.IDictionary; + if (endPoints is System.Collections.IDictionary endPointDict) + { + Serilog.Log.Debug("endPointDict: {EndPointDict} ,{Count}", endPointDict, endPointDict.Count); + + foreach (var endPointDictKey in endPointDict.Keys) + { + Serilog.Log.Debug("endPointDictKey: {EndPointDictKey} => {EndPointDictValue}", endPointDictKey, endPointDict[endPointDictKey]); + } + } + + Serilog.Log.Debug("LogginContext end"); + } + + bool isBind = false; + public NetMQPublisher() + { + // LogContext(); + + Serilog.Log.Debug("NetMQ server initializing, begin"); + + InitializeSelf(); + + clients = new List(); + syncMngr = new Synchronizer.Model.Manager(this); + + var (pubSub, pushPull) = Synchronizer.Model.Utilities.GetConnectionString(Self!.ProjectPath); + pubConnString = pubSub; + + //NetMQConfig.Linger = new TimeSpan(0); + + //pub = new Publisher(); + pubSocket = new PublisherSocket(); + + pubSocket.Options.SendHighWatermark = 1000; + Serilog.Log.Debug("NetMQ server initializing, Publisher socket binding... {PubConnString}", pubConnString); + //pubSocket.Bind("tcp://127.0.0.1:12349"); + + + try + { + pubSocket.Bind(pubConnString); + isBind = true; + Serilog.Log.Debug("NetMQ server initializing, Publisher socket bound"); + } + catch (AddressAlreadyInUseException ex) + { + Serilog.Log.Warning(ex, "NetMQ.AddressAlreadyInUseException"); + LogContext(); + Serilog.Log.Warning("NetMQ.AddressAlreadyInUseException disposing pubSocket"); + pubSocket.Dispose(); + pubSocket = null; + return; + } + catch (System.Net.Sockets.SocketException ex) + { + Serilog.Log.Warning(ex, "Socket exception"); + LogContext(); + Serilog.Log.Warning("Socket exception disposing pubSocket"); + pubSocket.Dispose(); + pubSocket = null; + return; + } + + + //pubSocket.SendReady += PubSocket_SendReady; + //SendConnect(); + + pullTaskCancellationTokenSource = new CancellationTokenSource(); + //pullThread = new System.Threading.Thread(async () => await PullAsync(conn.pushPull, pullThreadCancellationTokenSource.Token)); + //pullThread = new System.Threading.Thread(() => InitPull(conn.pushPull, pullTaskCancellationTokenSource.Token)); + //pullThread.Start(); + //Task.Run(() => InitPullAsync()); + + /* + pullTask = Task.Factory.StartNew( + () => InitPull(conn.pushPull, pullTaskCancellationTokenSource.Token), pullTaskCancellationTokenSource.Token, + System.Threading.Tasks.TaskCreationOptions.LongRunning, System.Threading.Tasks.TaskScheduler.Current); + */ + + + pullTask = Task.Factory.StartNew( + () => InitPull(pushPull, pullTaskCancellationTokenSource.Token), + System.Threading.Tasks.TaskCreationOptions.LongRunning); + + //InitPull(conn.pushPull); + + Serilog.Log.Debug("NetMQ server initializing, initialized"); + + // need to sleep here, clients will take some time to start subscribing + // https://github.com/zeromq/netmq/issues/482#issuecomment-182200323 + Thread.Sleep(1000); + SendConnect(); + } + + + private void InitPull(string connectionString, CancellationToken cancellationToken) + { + using (var runtime = new NetMQRuntime()) + { + runtime.Run(//cancellationToken, + PullAsync(connectionString, cancellationToken) + ); + Serilog.Log.Debug("Puller runtime ended"); + } + Serilog.Log.Debug("Puller runtime disposed"); + } + + async Task PullAsync(string connectionString, CancellationToken cancellationToken) + { + Serilog.Log.Debug("Puller begin"); + using (var pullSocket = new PullSocket(connectionString)) + { + while (!cancellationToken.IsCancellationRequested) + { + string header, content; + try + { + var headerTuple = await pullSocket.ReceiveFrameStringAsync(cancellationToken); + var contentTuple = await pullSocket.ReceiveFrameStringAsync(cancellationToken); + header = headerTuple.Item1; + content = contentTuple.Item1; + } + catch (System.Threading.Tasks.TaskCanceledException) + { + // Cancellation (token) requested + break; + } + Serilog.Log.Debug("Pulled: {Header}, {Content}", header, content); + + if (cancellationToken.IsCancellationRequested) + break; + + //**--optimize here, pass only params + MainThreadDispatcher.Add(() => syncMngr.ProcessMessage(header, content)); + //syncMngr.ProcessMessage(header.Item1, content.Item1); + } + + Serilog.Log.Debug("Puller closing"); + + pullSocket.Unbind(connectionString); + pullSocket.Close(); + + Serilog.Log.Debug("Puller closed"); + } + + Serilog.Log.Debug("Puller disposed"); + } + + public void Clear() + { + // LogContext(); + + Serilog.Log.Debug("NetMQ clearing, begin 1, pullTaskCancellationTokenSource: {PullTaskCancellationTokenSource}", pullTaskCancellationTokenSource); + pullTaskCancellationTokenSource?.Cancel(); + + Serilog.Log.Verbose("NetMQ clearing, begin 2, pubSocket: {PubSocket}", pubSocket); + var pubSocketDebugStr = pubSocket?.ToString(); + Serilog.Log.Debug("NetMQ clearing, begin 3, isBind: {IsBind}", isBind); + if (isBind) + { + pubSocket?.Unbind(pubConnString); + isBind = false; + } + Serilog.Log.Verbose("NetMQ clearing, begin 4"); + pubSocket?.Close(); + Serilog.Log.Verbose("NetMQ clearing, begin 5"); + pubSocket?.Dispose(); + Serilog.Log.Verbose("NetMQ clearing, begin 6"); + pubSocket = null; + Serilog.Log.Debug("NetMQ clearing, publisher closed pubSocketDebugStr: {PubSocketDebugStr}", pubSocketDebugStr); + + try + { + Serilog.Log.Debug("NetMQ clearing, Task 1 begin"); + + if (pullTask != null && !pullTask.Wait(1000)) + Serilog.Log.Warning("NetMQ clearing, pull task termination failed"); + + Serilog.Log.Verbose("NetMQ clearing, Task 2 waited"); + + pullTask?.Dispose(); + pullTask = null; + + Serilog.Log.Debug("NetMQ clearing, Task 3 disposed"); + } + catch (Exception ex) + { + //Console.WriteLine($"\n{nameof(OperationCanceledException)} thrown\n"); + Serilog.Log.Error(ex, "NetMQ clearing, pull task"); + } + finally + { + pullTaskCancellationTokenSource?.Dispose(); + pullTaskCancellationTokenSource = null; + Serilog.Log.Debug("NetMQ clearing, task cancelled"); + } + + Serilog.Log.Debug("NetMQ clearing, cleaning up"); + //pullSocket?.Close(); + NetMQConfig.Cleanup(false); // Must be here to work more than once. Also argument false is important, otherwise might freeze Unity upon exit or domain reload + //pullThread?.Abort(); + Serilog.Log.Debug("NetMQ clearing, cleared"); + } + + string SerializeObject(T obj) + where T : class + { + // Odin cant serialize string arrays, https://github.com/TeamSirenix/odin-serializer/issues/26 + //var buffer = OdinSerializer.SerializationUtility.SerializeValue(obj, OdinSerializer.DataFormat.JSON); + //var str = System.Text.Encoding.UTF8.GetString(buffer, 0, buffer.Length); + + // Newtonsoft works fine, but needs package reference + //var str = Newtonsoft.Json.JsonConvert.SerializeObject(obj); + + // not working + //var str = EditorJsonUtility.ToJson(obj); + + // needs nuget + //System.Text.Json.JsonSerializer; + + var str = TinyJson.JsonWriter.ToJson(obj); + + return str; + } + + void SendAux(Synchronizer.Model.IMessage message, bool logContent = true) + { + if (message == null) + return; + + SendAux(message.GetType().Name, message, logContent); + } + + void SendAux(string messageType, object content, bool logContent = true) + { + if (logContent) + Serilog.Log.Debug("Publishing {MessageType} {@Content}", messageType, content); + else + Serilog.Log.Debug("Publishing {MessageType}", messageType); + + var publisher = pubSocket; + if (publisher != null) + publisher.SendMoreFrame(messageType).SendFrame(SerializeObject(content)); + else + Serilog.Log.Error("Publisher socket is null"); + } + + public void SendConnect() + { + var connect = Self; + + SendAux(connect); + } + + public void SendDisconnect() + { + var disconnect = new Synchronizer.Model.Disconnect() + { + ModelVersion = Self.ModelVersion, + ProjectPath = Self.ProjectPath, + ProjectName = Self.ProjectName, + ContactInfo = Self.ContactInfo, + AssemblyVersion = Self.AssemblyVersion, + }; + + SendAux(disconnect); + } + + public void SendConnectionInfo() + { + var connectionInfo = new Synchronizer.Model.ConnectionInfo() + { + ModelVersion = Self.ModelVersion, + ProjectPath = Self.ProjectPath, + ProjectName = Self.ProjectName, + ContactInfo = Self.ContactInfo, + AssemblyVersion = Self.AssemblyVersion, + }; + + SendAux(connectionInfo); + } + + public void SendHandshake() + { + var handshake = new Synchronizer.Model.Handshake(); + + SendAux(handshake); + } + + public void SendRequestInternalLog() + { + var requestInternalLog = new Synchronizer.Model.RequestInternalLog(); + + SendAux(requestInternalLog); + } + + public void SendInternalLog() + { + var internalLog = new Synchronizer.Model.InternalLog() + { + LogContent = Logger.ELogger.GetInternalLogContent(), + }; + + SendAux(internalLog, logContent: false); + } + + + void SendStringArrayAux(string id, string[] array) + { + var stringArray = new Synchronizer.Model.StringArray() + { + Id = id, + Array = array, + }; + + SendAux(stringArray); + } + + void SendStringArrayContainerAux(params (string id, string[] array)[] container) + { + var stringArrayContainer = new Synchronizer.Model.StringArrayContainer() + { + Container = new Synchronizer.Model.StringArray[container.Length], + }; + + for (int i = 0; i < container.Length; i++) + { + stringArrayContainer.Container[i] = new Synchronizer.Model.StringArray + { + Id = container[i].id, + Array = container[i].array + }; + } + + SendAux(stringArrayContainer); + } + + public void SendTags(string[] tags) => + SendStringArrayAux(Synchronizer.Model.Ids.Tags, tags); + + /* + { + + var tags = new Synchronizer.Model.Tags() + { + TagArray = tagArray, + }; + + var serialized = Newtonsoft.Json.JsonConvert.SerializeObject(tags); + + pubSocket.SendMoreFrame(nameof(Synchronizer.Model.Tags)).SendFrame(serialized); + + + }*/ + + public void SendLayers(string[] layerIndices, string[] layerNames) + { + /* + var layers = new Synchronizer.Model.Layers() + { + LayerIndices = layerIndices, + LayerNames = layerNames, + }; + + var serialized = Newtonsoft.Json.JsonConvert.SerializeObject(layers); + + pubSocket.SendMoreFrame(nameof(Synchronizer.Model.Layers)).SendFrame(serialized); + */ + + //SendStringArrayAux(Synchronizer.Model.Ids.Layers, layerNames); + //SendStringArrayAux(Synchronizer.Model.Ids.LayerIndices, layerIndices); + SendStringArrayContainerAux( + (Synchronizer.Model.Ids.Layers, layerNames), + (Synchronizer.Model.Ids.LayerIndices, layerIndices) + ); + } + + public void SendSortingLayers(string[] sortingLayers, string[] sortingLayerIds, string[] sortingLayerValues) + { + //SendStringArrayAux(Synchronizer.Model.Ids.SortingLayers, sortingLayers); + //SendStringArrayAux(Synchronizer.Model.Ids.SortingLayerIds, sortingLayerIds); + //SendStringArrayAux(Synchronizer.Model.Ids.SortingLayerValues, sortingLayerValues); + + SendStringArrayContainerAux( + (Synchronizer.Model.Ids.SortingLayers, sortingLayers), + (Synchronizer.Model.Ids.SortingLayerIds, sortingLayerIds), + (Synchronizer.Model.Ids.SortingLayerValues, sortingLayerValues) + ); + } + + public void SendPlayerPrefs(string[] playerPrefKeys, string[] playerPrefValues, + string[] playerPrefStringKeys, string[] playerPrefIntegerKeys, string[] playerPrefFloatKeys) + { + SendStringArrayContainerAux( + (Synchronizer.Model.Ids.PlayerPrefKeys, playerPrefKeys), + (Synchronizer.Model.Ids.PlayerPrefValues, playerPrefValues), + (Synchronizer.Model.Ids.PlayerPrefStringKeys, playerPrefStringKeys), + (Synchronizer.Model.Ids.PlayerPrefIntegerKeys, playerPrefIntegerKeys), + (Synchronizer.Model.Ids.PlayerPrefFloatKeys, playerPrefFloatKeys) + ); + } + + public void SendEditorPrefs(string[] editorPrefKeys, string[] editorPrefValues, + string[] editorPrefStringKeys, string[] editorPrefIntegerKeys, string[] editorPrefFloatKeys, + string[] editorPrefBooleanKeys) + { + SendStringArrayContainerAux( + (Synchronizer.Model.Ids.EditorPrefKeys, editorPrefKeys), + (Synchronizer.Model.Ids.EditorPrefValues, editorPrefValues), + (Synchronizer.Model.Ids.EditorPrefStringKeys, editorPrefStringKeys), + (Synchronizer.Model.Ids.EditorPrefIntegerKeys, editorPrefIntegerKeys), + (Synchronizer.Model.Ids.EditorPrefFloatKeys, editorPrefFloatKeys), + (Synchronizer.Model.Ids.EditorPrefBooleanKeys, editorPrefBooleanKeys) + ); + } + + public void SendInputManager(string[] axisNames, string[] axisInfos, string[] buttonKeys, string[] buttonAxis, string[] joystickNames) + { + SendStringArrayContainerAux( + (Synchronizer.Model.Ids.InputManagerAxes, axisNames), + (Synchronizer.Model.Ids.InputManagerAxisInfos, axisInfos), + (Synchronizer.Model.Ids.InputManagerButtonKeys, buttonKeys), + (Synchronizer.Model.Ids.InputManagerButtonAxis, buttonAxis), + (Synchronizer.Model.Ids.InputManagerJoystickNames, joystickNames) + ); + } + + public void SendScriptMissing(string component) + { + var scriptMissing = new Synchronizer.Model.ScriptMissing() + { + Component = component, + }; + + SendAux(scriptMissing); + } + + public void SendGameObject(GameObject go) + { + if (!go) + return; + + Serilog.Log.Debug("SendGO: {GoName}", go.name); + + var dataOfSelf = go.ToSyncModel(priority:10000); + if (dataOfSelf != null) + SendAux(dataOfSelf); + + var dataOfHierarchy = go.ToSyncModelOfHierarchy(); + if (dataOfHierarchy != null) + { + foreach (var doh in dataOfHierarchy) + SendAux(doh); + } + + var dataOfComponents = go.ToSyncModelOfComponents(); + if (dataOfComponents != null) + { + foreach (var doc in dataOfComponents) + SendAux(doc); + } + + } + + public void SendScriptableObject(ScriptableObject so) + { + Serilog.Log.Debug("SendSO: {SoName}", so.name); + + var dataOfSo = so.ToSyncModel(); + if (dataOfSo != null) + SendAux(dataOfSo); + } + + public void SendAnalyticsEvent(string type, string content) + { + var dataOfAe = new Synchronizer.Model.AnalyticsEvent() + { + EventType = type, + EventContent = content + }; + SendAux(dataOfAe); + } + + public void SendErrorReport(string errorMessage, string stack, string type) + { + var dataOfER = new Synchronizer.Model.ErrorReport() + { + ErrorMessage = errorMessage, + ErrorStack = stack, + ErrorType = type, + }; + SendAux(dataOfER); + } + + public void SendRequestVerboseType(string type, string docPath) + { + var dataOfRVT = new Synchronizer.Model.RequestVerboseType() + { + Type = type, + DocPath = docPath, + }; + SendAux(dataOfRVT); + } + + + + string Synchronizer.Model.IProcessor.Serialize(T value) + { + //return System.Text.Json.JsonSerializer.Serialize(value); + //return Newtonsoft.Json.JsonConvert.SerializeObject(value); + return SerializeObject(value); + } + T Synchronizer.Model.IProcessor.Deserialize(string data) + { + //return System.Text.Json.JsonSerializer.Deserialize(data)!; + //return Newtonsoft.Json.JsonConvert.DeserializeObject(data)!; + return TinyJson.JsonParser.FromJson(data)!; + + //byte[] buffer = System.Text.Encoding.UTF8.GetBytes(data); + //T val = OdinSerializer.SerializationUtility.DeserializeValue(buffer, OdinSerializer.DataFormat.JSON); + //return val; + } + + //**--make sure all Synchronizer.Model.IProcessor.Process methods are thread-safe + + // a new client has connected + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.Connect connect) + { + if (connect.ModelVersion != Self.ModelVersion) + { + Serilog.Log.Error("Version mismatch with {ContactInfo}. Please update your asset and reinstall the Visual Studio extension. {ContactModel} != {SelfModel}", connect.ContactInfo, connect.ModelVersion, Self.ModelVersion); + return; + } + + if (connect.ProjectPath != Self.ProjectPath) + { + Serilog.Log.Error("Project mismatch with {ProjectName}. '{ConnectPath}' != '{SelfPath}'", connect.ProjectName, connect.ProjectPath, Self.ProjectPath); + return; + } + + if (!clients.Any(c => c.ContactInfo == connect.ContactInfo)) + { + clients.Add(connect); + } + + SendHandshake(); + if (ScriptFinder.GetActiveGameObject(out var activeGO)) + SendGameObject(activeGO); + Assister.SendTagsAndLayers(); + } + + // a new client is online and requesting connection + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RequestConnect requestConnect) + { + SendConnect(); + } + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.Disconnect disconnect) + { + var client = clients.FirstOrDefault(c => c.ContactInfo == disconnect.ContactInfo); + if (client == null) + return; + + clients.Remove(client); + } + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.ConnectionInfo connectionInfo) + { + if (connectionInfo.ModelVersion != Self.ModelVersion) + { + Serilog.Log.Error("Version mismatch with {ContactInfo}. Please update your asset and reinstall the Visual Studio extension. {ContactModel} != {SelfModel}", connectionInfo.ContactInfo, connectionInfo.ModelVersion, Self.ModelVersion); + return; + } + + if (connectionInfo.ProjectPath != Self.ProjectPath) + { + Serilog.Log.Error("Project mismatch with {ProjectName}. '{ConnectPath}' != '{SelfPath}'", connectionInfo.ProjectName, connectionInfo.ProjectPath, Self.ProjectPath); + return; + } + + if (!clients.Any(c => c.ContactInfo == connectionInfo.ContactInfo)) + { + SendConnect(); + } + else + { + SendHandshake(); + if (ScriptFinder.GetActiveGameObject(out var activeGO)) + SendGameObject(activeGO); + Assister.SendTagsAndLayers(); + } + } + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RequestConnectionInfo requestConnectionInfo) + { + SendConnectionInfo(); + } + /* + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.Layers layers) + { + + } + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.Tags tags) + { + + } + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.SortingLayers sortingLayers) + { + + }*/ + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.StringArray stringArray) + { + Serilog.Log.Warning("Unity/Server shouldn't call Synchronizer.Model.IProcessor.Process(Synchronizer.Model.StringArray)"); + } + + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.StringArrayContainer stringArrayContainer) + { + Serilog.Log.Warning("Unity/Server shouldn't call Synchronizer.Model.IProcessor.Process(Synchronizer.Model.StringArrayContainer)"); + } + + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.GameObject gameObject) + { + Serilog.Log.Warning("Unity/Server shouldn't call Synchronizer.Model.IProcessor.Process(Synchronizer.Model.GameObject)"); + } + + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.ComponentData component) + { + Serilog.Log.Warning("Unity/Server shouldn't call Synchronizer.Model.IProcessor.Process(Synchronizer.Model.ComponentData)"); + } + + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RequestScript requestScript) + { + if (requestScript.DeclaredTypes == null || requestScript.DeclaredTypes.Length == 0) + return; + + var documentPath = requestScript.DocumentPath; + + foreach (var declaredType in requestScript.DeclaredTypes) + { + if (ScriptFinder.FindInstanceOfType(declaredType, documentPath, out var go, out var so)) + { + if (go != null) + SendGameObject(go); + else if (so != null) + SendScriptableObject(so); + else + Serilog.Log.Warning("Invalid instance of type"); + } + else + { + SendScriptMissing(declaredType); + } + } + } + + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.ScriptMissing scriptMissing) + { + Serilog.Log.Warning("Unity/Server shouldn't call Synchronizer.Model.IProcessor.Process(Synchronizer.Model.ScriptMissing)"); + } + + + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.Handshake handshake) + { + // Do nothing + } + + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RequestInternalLog requestInternalLog) + { + SendInternalLog(); + } + + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.InternalLog internalLog) + { + Logger.ELogger.VsInternalLog = internalLog.LogContent; + } + + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.AnalyticsEvent analyticsEvent) + { + Serilog.Log.Warning("Unity/Server shouldn't call Synchronizer.Model.IProcessor.Process(Synchronizer.Model.AnalyticsEvent)"); + } + + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.ErrorReport errorReport) + { + Serilog.Log.Warning("Unity/Server shouldn't call Synchronizer.Model.IProcessor.Process(Synchronizer.Model.ErrorReport)"); + } + + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RequestVerboseType requestVerboseType) + { + Serilog.Log.Warning("Unity/Server shouldn't call Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RequestVerboseType)"); + } + + void Synchronizer.Model.IProcessor.Process(Synchronizer.Model.RequestLazyLoad requestLazyLoad) + { + Monitor.LazyLoad(requestLazyLoad.Category); + } + + + + } +} + diff --git a/Assets/Plugins/CodeAssist/Editor/NetMQPublisher.cs.meta b/Assets/Plugins/CodeAssist/Editor/NetMQPublisher.cs.meta new file mode 100644 index 00000000..8cf491f0 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/NetMQPublisher.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3ffb8a66e80e3f347b92ab48665605a6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/Preferences.meta b/Assets/Plugins/CodeAssist/Editor/Preferences.meta new file mode 100644 index 00000000..9caa817c --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Preferences.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7339a549a1655e641823dfe063332b1c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceEntryHolder.cs b/Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceEntryHolder.cs new file mode 100644 index 00000000..631a1d33 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceEntryHolder.cs @@ -0,0 +1,65 @@ +using System.Collections.Generic; +using UnityEngine; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +#pragma warning restore IDE0005 + + +#nullable enable + + +//namespace BgTools.PlayerPrefsEditor +namespace Meryel.UnityCodeAssist.Editor.Preferences +{ + [System.Serializable] + public class PreferenceEntryHolder : ScriptableObject + { + public List? userDefList; + public List? unityDefList; + + private void OnEnable() + { + hideFlags = HideFlags.DontSave; + userDefList ??= new List(); + unityDefList ??= new List(); + } + + public void ClearLists() + { + userDefList?.Clear(); + unityDefList?.Clear(); + } + } + + [System.Serializable] + public class PreferenceEntry + { + public enum PrefTypes + { + String = 0, + Int = 1, + Float = 2 + } + + public PrefTypes m_typeSelection; + public string? m_key; + + // Need diffrend ones for auto type selection of serilizedProerty + public string? m_strValue; + public int m_intValue; + public float m_floatValue; + + public string? ValueAsString() + { + return m_typeSelection switch + { + PrefTypes.String => m_strValue, + PrefTypes.Int => m_intValue.ToString(), + PrefTypes.Float => m_floatValue.ToString(), + _ => string.Empty, + }; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceEntryHolder.cs.meta b/Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceEntryHolder.cs.meta new file mode 100644 index 00000000..7eff0b2e --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceEntryHolder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d04cba5952ee71a4ba4d9d70fb13b113 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceMonitor.cs b/Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceMonitor.cs new file mode 100644 index 00000000..74a1fb23 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceMonitor.cs @@ -0,0 +1,375 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Globalization; +using UnityEditor; +using UnityEngine; +using UnityEditorInternal; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +#pragma warning restore IDE0005 + + +#nullable enable + + +namespace Meryel.UnityCodeAssist.Editor.Preferences +{ + public class PreferenceMonitor + { + private static readonly Lazy _instanceOfPlayerPrefs = new Lazy(() => new PreferenceMonitor(true)); + private static readonly Lazy _instanceOfEditorPrefs = new Lazy(() => new PreferenceMonitor(false)); + public static PreferenceMonitor InstanceOfPlayerPrefs => _instanceOfPlayerPrefs.Value; + public static PreferenceMonitor InstanceOfEditorPrefs => _instanceOfEditorPrefs.Value; + + //const int Limit = 128; + const int Limit = 8192; + + /// + /// PlayerPrefs or EditorPrefs + /// + readonly bool isPlayerPrefs; + +#region ErrorValues + private readonly int ERROR_VALUE_INT = int.MinValue; + private readonly string ERROR_VALUE_STR = ""; +#endregion //ErrorValues + +#pragma warning disable CS0414 + private static string pathToPrefs = String.Empty; + private static string platformPathPrefix = @"~"; +#pragma warning restore CS0414 + + //private string[] userDef; + //private string[] unityDef; + //private bool showSystemGroup = false; + + private SerializedObject? serializedObject; + private ReorderableList? userDefList; + private ReorderableList? unityDefList; + + private PreferenceEntryHolder? prefEntryHolder; + + private PreferanceStorageAccessor? entryAccessor; + + + private bool updateView = false; + //private bool monitoring = false; + //private bool showLoadingIndicatorOverlay = false; + + +#if UNITY_EDITOR_LINUX + private readonly char[] invalidFilenameChars = { '"', '\\', '*', '/', ':', '<', '>', '?', '|' }; +#elif UNITY_EDITOR_OSX + private readonly char[] invalidFilenameChars = { '$', '%', '&', '\\', '/', ':', '<', '>', '|', '~' }; +#endif + + + + PreferenceMonitor(bool isPlayerPrefs) + { + this.isPlayerPrefs = isPlayerPrefs; + OnEnable(); + EditorApplication.update += Update; + } + + ~PreferenceMonitor() + { + OnDisable(); + } + + public void Bump() + { + Serilog.Log.Debug("Bumping preference {IsPlayerPrefs}", isPlayerPrefs); + + RetrieveAndSendKeysAndValues(false); + } + + private void RetrieveAndSendKeysAndValues(bool reloadKeys) + { + string[]? keys = GetKeys(reloadKeys); + if (keys == null) + return; + string[] values = GetKeyValues(reloadKeys, keys, out var stringKeys, out var integerKeys, out var floatKeys, out var booleanKeys); + + if (isPlayerPrefs) + NetMQInitializer.Publisher?.SendPlayerPrefs(keys, values, stringKeys, integerKeys, floatKeys); + else + NetMQInitializer.Publisher?.SendEditorPrefs(keys, values, stringKeys, integerKeys, floatKeys, booleanKeys); + } + + private void OnEnable() + { +#if UNITY_EDITOR_WIN + if (isPlayerPrefs) + pathToPrefs = @"SOFTWARE\Unity\UnityEditor\" + PlayerSettings.companyName + @"\" + PlayerSettings.productName; + else + pathToPrefs = @"Software\Unity Technologies\Unity Editor 5.x"; + + platformPathPrefix = @""; + entryAccessor = new WindowsPrefStorage(pathToPrefs); +#elif UNITY_EDITOR_OSX + if (isPlayerPrefs) + pathToPrefs = @"Library/Preferences/com." + MakeValidFileName(PlayerSettings.companyName) + "." + MakeValidFileName(PlayerSettings.productName) + ".plist"; + else + pathToPrefs = @"Library/Preferences/com.unity3d.UnityEditor5.x.plist"; + + platformPathPrefix = @"~"; + entryAccessor = new MacPrefStorage(pathToPrefs); + //entryAccessor.StartLoadingDelegate = () => { showLoadingIndicatorOverlay = true; }; + //entryAccessor.StopLoadingDelegate = () => { showLoadingIndicatorOverlay = false; }; +#elif UNITY_EDITOR_LINUX + if (isPlayerPrefs) + pathToPrefs = @".config/unity3d/" + MakeValidFileName(PlayerSettings.companyName) + "/" + MakeValidFileName(PlayerSettings.productName) + "/prefs"; + else + pathToPrefs = @".local/share/unity3d/prefs"; + + platformPathPrefix = @"~"; + entryAccessor = new LinuxPrefStorage(pathToPrefs); +#else + Serilog.Log.Warning("Undefined Unity Editor platform"); + pathToPrefs = String.Empty; + platformPathPrefix = @"~"; + entryAccessor = null; +#endif + + if (entryAccessor != null) + { + entryAccessor.PrefEntryChangedDelegate = () => { updateView = true; }; + entryAccessor.StartMonitoring(); + } + } + + // Handel view updates for monitored changes + // Necessary to avoid main thread access issue + private void Update() + { + if (updateView) + { + updateView = false; + //PrepareData(); + //Repaint(); + + Serilog.Log.Debug("Updating preference {IsPlayerPrefs}", isPlayerPrefs); + + RetrieveAndSendKeysAndValues(true); + } + } + + private void OnDisable() + { + entryAccessor?.StopMonitoring(); + } + + private void InitReorderedList() + { + if (prefEntryHolder == null) + { + var tmp = Resources.FindObjectsOfTypeAll(); + if (tmp.Length > 0) + { + prefEntryHolder = tmp[0]; + } + else + { + prefEntryHolder = ScriptableObject.CreateInstance(); + } + } + + + serializedObject ??= new SerializedObject(prefEntryHolder); + + userDefList = new ReorderableList(serializedObject, serializedObject.FindProperty("userDefList"), false, true, true, true); + unityDefList = new ReorderableList(serializedObject, serializedObject.FindProperty("unityDefList"), false, true, false, false); + + } + + + + + private string[]? GetKeys(bool reloadKeys) + { + if (entryAccessor == null) + { + Serilog.Log.Warning($"{nameof(entryAccessor)} is null"); + return null; + } + + string[] keys = entryAccessor.GetKeys(reloadKeys); + + if (keys.Length > Limit) + keys = keys.Where(k => !k.StartsWith("unity.") && !k.StartsWith("UnityGraphicsQuality")).Take(Limit).ToArray(); + + return keys; + } + + string[]? _cachedKeyValues = null; + + string[]? _cachedStringKeys = null; + string[]? _cachedIntegerKeys = null; + string[]? _cachedFloatKeys = null; + string[]? _cachedBooleanKeys = null; + + private string[] GetKeyValues(bool reloadData, string[] keys, + out string[] stringKeys, out string[] integerKeys, out string[] floatKeys, out string[] booleanKeys) + { + if (!reloadData && _cachedKeyValues != null && _cachedKeyValues.Length == keys.Length) + { + stringKeys = _cachedStringKeys!; + integerKeys = _cachedIntegerKeys!; + floatKeys = _cachedFloatKeys!; + booleanKeys = _cachedBooleanKeys!; + return _cachedKeyValues; + } + + string[] values = new string[keys.Length]; + var stringKeyList = new List(); + var integerKeyList = new List(); + var floatKeyList = new List(); + var boolenKeyList = new List(); + + for (int i = 0; i < keys.Length; i++) + { + var key = keys[i]; + + string stringValue; + if (isPlayerPrefs) + stringValue = PlayerPrefs.GetString(key, ERROR_VALUE_STR); + else + stringValue = EditorPrefs.GetString(key, ERROR_VALUE_STR); + + if (stringValue != ERROR_VALUE_STR) + { + values[i] = stringValue; + stringKeyList.Add(key); + continue; + } + + float floatValue; + if (isPlayerPrefs) + floatValue = PlayerPrefs.GetFloat(key, float.NaN); + else + floatValue = EditorPrefs.GetFloat(key, float.NaN); + + if (!float.IsNaN(floatValue)) + { + values[i] = floatValue.ToString(); + floatKeyList.Add(key); + continue; + } + + int intValue; + if (isPlayerPrefs) + intValue = PlayerPrefs.GetInt(key, ERROR_VALUE_INT); + else + intValue = EditorPrefs.GetInt(key, ERROR_VALUE_INT); + + if (intValue != ERROR_VALUE_INT) + { + values[i] = intValue.ToString(); + integerKeyList.Add(key); + continue; + } + + bool boolValue = false; + if (!isPlayerPrefs) + { + bool boolValueTrue = EditorPrefs.GetBool(key, true); + bool boolValueFalse = EditorPrefs.GetBool(key, false); + + boolValue = boolValueFalse; + if (boolValueTrue == boolValueFalse) + { + values[i] = boolValueTrue.ToString(); + boolenKeyList.Add(key); + continue; + } + } + + values[i] = string.Empty; + if (isPlayerPrefs) + { + // Keys with ? causing problems, just ignore them + if (key.Contains("?")) + Serilog.Log.Debug("Invalid {PreferenceType} KEY WITH '?', '{Key}' at {Location}, str:{StringValue}, int:{IntegerValue}, float:{FloatValue}, bool:{BooleanValue}", + (isPlayerPrefs ? "PlayerPrefs" : "EditorPrefs"), key, nameof(GetKeyValues), + stringValue, intValue, floatValue, boolValue); + + else + // EditorPrefs gives error for some keys + Serilog.Log.Error("Invalid {PreferenceType} '{Key}' at {Location}, str:{StringValue}, int:{IntegerValue}, float:{FloatValue}, bool:{BooleanValue}", + (isPlayerPrefs ? "PlayerPrefs" : "EditorPrefs"), key, nameof(GetKeyValues), + stringValue, intValue, floatValue, boolValue); + } + } + + stringKeys = stringKeyList.ToArray(); + integerKeys = integerKeyList.ToArray(); + floatKeys = floatKeyList.ToArray(); + booleanKeys = boolenKeyList.ToArray(); + + _cachedKeyValues = values; + + _cachedStringKeys = stringKeys; + _cachedIntegerKeys = integerKeys; + _cachedFloatKeys = floatKeys; + _cachedBooleanKeys = booleanKeys; + + return values; + } + + private void LoadKeys(out string[]? userDef, out string[]? unityDef, bool reloadKeys) + { + if(entryAccessor == null) + { + userDef = null; + unityDef = null; + return; + } + + string[] keys = entryAccessor.GetKeys(reloadKeys); + + //keys.ToList().ForEach( e => { Debug.Log(e); } ); + + // Seperate keys int unity defined and user defined + Dictionary> groups = keys + .GroupBy((key) => key.StartsWith("unity.") || key.StartsWith("UnityGraphicsQuality")) + .ToDictionary((g) => g.Key, (g) => g.ToList()); + + unityDef = (groups.ContainsKey(true)) ? groups[true].ToArray() : new string[0]; + userDef = (groups.ContainsKey(false)) ? groups[false].ToArray() : new string[0]; + } + + +#if (UNITY_EDITOR_LINUX || UNITY_EDITOR_OSX) + private string MakeValidFileName(string unsafeFileName) + { + string normalizedFileName = unsafeFileName.Trim().Normalize(NormalizationForm.FormD); + StringBuilder stringBuilder = new StringBuilder(); + + // We need to use a TextElementEmumerator in order to support UTF16 characters that may take up more than one char(case 1169358) + TextElementEnumerator charEnum = StringInfo.GetTextElementEnumerator(normalizedFileName); + while (charEnum.MoveNext()) + { + string c = charEnum.GetTextElement(); + if (c.Length == 1 && invalidFilenameChars.Contains(c[0])) + { + stringBuilder.Append('_'); + continue; + } + UnicodeCategory unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c, 0); + if (unicodeCategory != UnicodeCategory.NonSpacingMark) + stringBuilder.Append(c); + } + return stringBuilder.ToString().Normalize(NormalizationForm.FormC); + } +#endif + + } + + +} diff --git a/Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceMonitor.cs.meta b/Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceMonitor.cs.meta new file mode 100644 index 00000000..ab2d9d5c --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceMonitor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d554c283b1ce0e6459320ac75bad7373 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceStorageAccessor.cs b/Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceStorageAccessor.cs new file mode 100644 index 00000000..ad1d57e3 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceStorageAccessor.cs @@ -0,0 +1,292 @@ +using System; +using System.Linq; + +#if UNITY_EDITOR_WIN +using Microsoft.Win32; +using System.Text; +#elif UNITY_EDITOR_OSX +using System.Diagnostics; +using System.IO; +using System.Text.RegularExpressions; +#elif UNITY_EDITOR_LINUX +using System.IO; +using System.Xml; +using System.Xml.Linq; +#endif + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +#pragma warning restore IDE0005 + + +#nullable enable + + +//namespace BgTools.PlayerPrefsEditor +namespace Meryel.UnityCodeAssist.Editor.Preferences +{ + public abstract class PreferanceStorageAccessor + { + protected string prefPath; + protected string[] cachedData = new string[0]; + + protected abstract void FetchKeysFromSystem(); + + protected PreferanceStorageAccessor(string pathToPrefs) + { + prefPath = pathToPrefs; + } + + public string[] GetKeys(bool reloadData = true) + { + if (reloadData || cachedData.Length == 0) + { + FetchKeysFromSystem(); + } + + return cachedData; + } + + public Action? PrefEntryChangedDelegate; + protected bool ignoreNextChange = false; + + public void IgnoreNextChange() + { + ignoreNextChange = true; + } + + protected virtual void OnPrefEntryChanged() + { + if (ignoreNextChange) + { + ignoreNextChange = false; + return; + } + + PrefEntryChangedDelegate?.Invoke(); + } + + public Action? StartLoadingDelegate; + public Action? StopLoadingDelegate; + + public abstract void StartMonitoring(); + public abstract void StopMonitoring(); + public abstract bool IsMonitoring(); + } + +#if UNITY_EDITOR_WIN + + public class WindowsPrefStorage : PreferanceStorageAccessor + { + readonly RegistryMonitor monitor; + + public WindowsPrefStorage(string pathToPrefs) : base(pathToPrefs) + { + monitor = new RegistryMonitor(RegistryHive.CurrentUser, prefPath); + monitor.RegChanged += new EventHandler(OnRegChanged); + } + + private void OnRegChanged(object sender, EventArgs e) + { + OnPrefEntryChanged(); + } + + protected override void FetchKeysFromSystem() + { + cachedData = new string[0]; + + using (RegistryKey rootKey = Registry.CurrentUser.OpenSubKey(prefPath)) + { + if (rootKey != null) + { + cachedData = rootKey.GetValueNames(); + rootKey.Close(); + } + } + + // Clean _h3320113488 nameing + //cachedData = cachedData.Select((key) => { return key.Substring(0, key.LastIndexOf("_h", StringComparison.Ordinal)); }).ToArray(); + for (int i = 0; i < cachedData.Length; i++) + { + var indexOfSuffix = cachedData[i].LastIndexOf("_h", StringComparison.Ordinal); + if (indexOfSuffix >= 0) + cachedData[i] = cachedData[i].Substring(0, indexOfSuffix); + } + + EncodeAnsiInPlace(); + } + + public override void StartMonitoring() + { + monitor.Start(); + } + + public override void StopMonitoring() + { + monitor.Stop(); + } + + public override bool IsMonitoring() + { + return monitor.IsMonitoring; + } + + private void EncodeAnsiInPlace() + { + Encoding utf8 = Encoding.UTF8; + Encoding ansi = Encoding.GetEncoding(1252); + + for (int i = 0; i < cachedData.Length; i++) + { + cachedData[i] = utf8.GetString(ansi.GetBytes(cachedData[i])); + } + } + } + +#elif UNITY_EDITOR_LINUX + + public class LinuxPrefStorage : PreferanceStorageAccessor + { + readonly FileSystemWatcher fileWatcher; + + public LinuxPrefStorage(string pathToPrefs) : base(Path.Combine(Environment.GetEnvironmentVariable("HOME"), pathToPrefs)) + { + fileWatcher = new FileSystemWatcher + { + Path = Path.GetDirectoryName(prefPath), + NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite, + Filter = "prefs" + }; + + fileWatcher.Changed += OnWatchedFileChanged; + } + + protected override void FetchKeysFromSystem() + { + cachedData = new string[0]; + + if (File.Exists(prefPath)) + { + XmlReaderSettings settings = new XmlReaderSettings(); + XmlReader reader = XmlReader.Create(prefPath, settings); + + XDocument doc = XDocument.Load(reader); + + cachedData = doc.Element("unity_prefs").Elements().Select((e) => e.Attribute("name").Value).ToArray(); + } + } + + public override void StartMonitoring() + { + fileWatcher.EnableRaisingEvents = true; + } + + public override void StopMonitoring() + { + fileWatcher.EnableRaisingEvents = false; + } + + public override bool IsMonitoring() + { + return fileWatcher.EnableRaisingEvents; + } + + private void OnWatchedFileChanged(object source, FileSystemEventArgs e) + { + OnPrefEntryChanged(); + } + } + +#elif UNITY_EDITOR_OSX + + public class MacPrefStorage : PreferanceStorageAccessor + { + private readonly FileSystemWatcher fileWatcher; + private readonly DirectoryInfo prefsDirInfo; + private readonly String prefsFileNameWithoutExtension; + + public MacPrefStorage(string pathToPrefs) : base(Path.Combine(Environment.GetEnvironmentVariable("HOME"), pathToPrefs)) + { + prefsDirInfo = new DirectoryInfo(Path.GetDirectoryName(prefPath)); + prefsFileNameWithoutExtension = Path.GetFileNameWithoutExtension(prefPath); + + fileWatcher = new FileSystemWatcher + { + Path = Path.GetDirectoryName(prefPath), + NotifyFilter = NotifyFilters.LastWrite, + Filter = Path.GetFileName(prefPath) + }; + + // MAC delete the old and create a new file instead of updating + fileWatcher.Created += OnWatchedFileChanged; + } + + protected override void FetchKeysFromSystem() + { + // Workaround to avoid incomplete tmp phase from MAC OS + foreach (FileInfo info in prefsDirInfo.GetFiles()) + { + // Check if tmp PlayerPrefs file exist + if (info.FullName.Contains(prefsFileNameWithoutExtension) && !info.FullName.EndsWith(".plist")) + { + StartLoadingDelegate?.Invoke(); + return; + } + } + StopLoadingDelegate?.Invoke(); + + cachedData = new string[0]; + + if (File.Exists(prefPath)) + { + string fixedPrefsPath = prefPath.Replace("\"", "\\\"").Replace("'", "\\'").Replace("`", "\\`"); + var cmdStr = string.Format(@"-p '{0}'", fixedPrefsPath); + + string stdOut = String.Empty; + string errOut = String.Empty; + + var process = new System.Diagnostics.Process(); + process.StartInfo.UseShellExecute = false; + process.StartInfo.FileName = "plutil"; + process.StartInfo.Arguments = cmdStr; + process.StartInfo.RedirectStandardOutput = true; + process.StartInfo.RedirectStandardError = true; + process.OutputDataReceived += new DataReceivedEventHandler((sender, evt) => { stdOut += evt.Data + "\n"; }); + process.ErrorDataReceived += new DataReceivedEventHandler((sender, evt) => { errOut += evt.Data + "\n"; }); + + process.Start(); + + process.BeginOutputReadLine(); + process.BeginErrorReadLine(); + + process.WaitForExit(); + + MatchCollection matches = Regex.Matches(stdOut, @"(?: "")(.*)(?:"" =>.*)"); + cachedData = matches.Cast().Select((e) => e.Groups[1].Value).ToArray(); + } + } + + public override void StartMonitoring() + { + fileWatcher.EnableRaisingEvents = true; + } + + public override void StopMonitoring() + { + fileWatcher.EnableRaisingEvents = false; + } + + public override bool IsMonitoring() + { + return fileWatcher.EnableRaisingEvents; + } + + private void OnWatchedFileChanged(object source, FileSystemEventArgs e) + { + OnPrefEntryChanged(); + } + + } +#endif +} diff --git a/Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceStorageAccessor.cs.meta b/Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceStorageAccessor.cs.meta new file mode 100644 index 00000000..8c547252 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Preferences/PreferenceStorageAccessor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: be08747fe28222a44b56e678ad8fa24c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/Preferences/RegistryMonitor.cs b/Assets/Plugins/CodeAssist/Editor/Preferences/RegistryMonitor.cs new file mode 100644 index 00000000..cd50d08c --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Preferences/RegistryMonitor.cs @@ -0,0 +1,339 @@ + +/* + * Thanks to gr0ss for the inspiration. + * + * https://github.com/gr0ss/RegistryMonitor + * + * 11/08/2019 + */ + +using System; +using System.ComponentModel; +using System.IO; +using System.Threading; +using System.Runtime.InteropServices; +using Microsoft.Win32; + +//namespace BgTools.PlayerPrefsEditor +namespace Meryel.UnityCodeAssist.Editor.Preferences +{ + public class RegistryMonitor : IDisposable + { + #region P/Invoke + + [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)] + private static extern int RegOpenKeyEx(IntPtr hKey, string subKey, uint options, int samDesired, out IntPtr phkResult); + + [DllImport("advapi32.dll", SetLastError = true)] + private static extern int RegNotifyChangeKeyValue(IntPtr hKey, bool bWatchSubtree, RegChangeNotifyFilter dwNotifyFilter, IntPtr hEvent, bool fAsynchronous); + + [DllImport("advapi32.dll", SetLastError = true)] + private static extern int RegCloseKey(IntPtr hKey); + + private const int KEY_QUERY_VALUE = 0x0001; + private const int KEY_NOTIFY = 0x0010; + private const int STANDARD_RIGHTS_READ = 0x00020000; + + private static readonly IntPtr HKEY_CLASSES_ROOT = new IntPtr(unchecked((int)0x80000000)); + private static readonly IntPtr HKEY_CURRENT_USER = new IntPtr(unchecked((int)0x80000001)); + private static readonly IntPtr HKEY_LOCAL_MACHINE = new IntPtr(unchecked((int)0x80000002)); + private static readonly IntPtr HKEY_USERS = new IntPtr(unchecked((int)0x80000003)); + private static readonly IntPtr HKEY_PERFORMANCE_DATA = new IntPtr(unchecked((int)0x80000004)); + private static readonly IntPtr HKEY_CURRENT_CONFIG = new IntPtr(unchecked((int)0x80000005)); + private static readonly IntPtr HKEY_DYN_DATA = new IntPtr(unchecked((int)0x80000006)); + + #endregion + + #region Event handling + + /// + /// Occurs when the specified registry key has changed. + /// + public event EventHandler RegChanged; + + /// + /// Raises the event. + /// + /// + ///

+ /// OnRegChanged is called when the specified registry key has changed. + ///

+ /// + /// When overriding in a derived class, be sure to call + /// the base class's method. + /// + ///
+ protected virtual void OnRegChanged() + { + RegChanged?.Invoke(this, null); + } + + /// + /// Occurs when the access to the registry fails. + /// + public event ErrorEventHandler Error; + + /// + /// Raises the event. + /// + /// The which occured while watching the registry. + /// + ///

+ /// OnError is called when an exception occurs while watching the registry. + ///

+ /// + /// When overriding in a derived class, be sure to call + /// the base class's method. + /// + ///
+ protected virtual void OnError(Exception e) + { + Error?.Invoke(this, new ErrorEventArgs(e)); + } + + #endregion + + #region Private member variables + + private IntPtr _registryHive; + private string _registrySubName; + private readonly object _threadLock = new object(); + private Thread _thread; + private bool _disposed = false; + private readonly ManualResetEvent _eventTerminate = new ManualResetEvent(false); + + private RegChangeNotifyFilter _regFilter = RegChangeNotifyFilter.Key | RegChangeNotifyFilter.Attribute | RegChangeNotifyFilter.Value | RegChangeNotifyFilter.Security; + + #endregion + + /// + /// Initializes a new instance of the class. + /// + /// The registry key to monitor. + public RegistryMonitor(RegistryKey registryKey) + { + InitRegistryKey(registryKey.Name); + } + + /// + /// Initializes a new instance of the class. + /// + /// The name. + public RegistryMonitor(string name) + { + if (name == null || name.Length == 0) + throw new ArgumentNullException("name"); + + InitRegistryKey(name); + } + + /// + /// Initializes a new instance of the class. + /// + /// The registry hive. + /// The sub key. + public RegistryMonitor(RegistryHive registryHive, string subKey) + { + InitRegistryKey(registryHive, subKey); + } + + /// + /// Disposes this object. + /// + public void Dispose() + { + Stop(); + _disposed = true; + GC.SuppressFinalize(this); + } + + /// + /// Gets or sets the RegChangeNotifyFilter. + /// + public RegChangeNotifyFilter RegChangeNotifyFilter + { + get { return _regFilter; } + set + { + lock (_threadLock) + { + if (IsMonitoring) + throw new InvalidOperationException("Monitoring thread is already running"); + + _regFilter = value; + } + } + } + + #region Initialization + + private void InitRegistryKey(RegistryHive hive, string name) + { + _registryHive = hive switch + { + RegistryHive.ClassesRoot => HKEY_CLASSES_ROOT, + RegistryHive.CurrentConfig => HKEY_CURRENT_CONFIG, + RegistryHive.CurrentUser => HKEY_CURRENT_USER, + RegistryHive.DynData => HKEY_DYN_DATA, + RegistryHive.LocalMachine => HKEY_LOCAL_MACHINE, + RegistryHive.PerformanceData => HKEY_PERFORMANCE_DATA, + RegistryHive.Users => HKEY_USERS, + _ => throw new InvalidEnumArgumentException("hive", (int)hive, typeof(RegistryHive)), + }; + _registrySubName = name; + } + + private void InitRegistryKey(string name) + { + string[] nameParts = name.Split('\\'); + + switch (nameParts[0]) + { + case "HKEY_CLASSES_ROOT": + case "HKCR": + _registryHive = HKEY_CLASSES_ROOT; + break; + + case "HKEY_CURRENT_USER": + case "HKCU": + _registryHive = HKEY_CURRENT_USER; + break; + + case "HKEY_LOCAL_MACHINE": + case "HKLM": + _registryHive = HKEY_LOCAL_MACHINE; + break; + + case "HKEY_USERS": + _registryHive = HKEY_USERS; + break; + + case "HKEY_CURRENT_CONFIG": + _registryHive = HKEY_CURRENT_CONFIG; + break; + + default: + _registryHive = IntPtr.Zero; + throw new ArgumentException("The registry hive '" + nameParts[0] + "' is not supported", "value"); + } + + _registrySubName = String.Join("\\", nameParts, 1, nameParts.Length - 1); + } + + #endregion + + /// + /// true if this object is currently monitoring; + /// otherwise, false. + /// + public bool IsMonitoring + { + get { return _thread != null; } + } + + /// + /// Start monitoring. + /// + public void Start() + { + if (_disposed) + throw new ObjectDisposedException(null, "This instance is already disposed"); + + lock (_threadLock) + { + if (!IsMonitoring) + { + _eventTerminate.Reset(); + _thread = new Thread(new ThreadStart(MonitorThread)) { IsBackground = true }; + _thread.Start(); + } + } + } + + /// + /// Stops the monitoring thread. + /// + public void Stop() + { + if (_disposed) + throw new ObjectDisposedException(null, "This instance is already disposed"); + + lock (_threadLock) + { + Thread thread = _thread; + if (thread != null) + { + _eventTerminate.Set(); + thread.Join(); + } + } + } + + private void MonitorThread() + { + try + { + ThreadLoop(); + } + catch (Exception e) + { + OnError(e); + } + _thread = null; + } + + private void ThreadLoop() + { + int result = RegOpenKeyEx(_registryHive, _registrySubName, 0, STANDARD_RIGHTS_READ | KEY_QUERY_VALUE | KEY_NOTIFY, out IntPtr registryKey); + if (result != 0) + { + throw new Win32Exception(result); + } + + try + { + AutoResetEvent _eventNotify = new AutoResetEvent(false); + WaitHandle[] waitHandles = new WaitHandle[] { _eventNotify, _eventTerminate }; + while (!_eventTerminate.WaitOne(0, true)) + { + result = RegNotifyChangeKeyValue(registryKey, true, _regFilter, _eventNotify.SafeWaitHandle.DangerousGetHandle(), true); + if (result != 0) + { + throw new Win32Exception(result); + } + + if (WaitHandle.WaitAny(waitHandles) == 0) + { + OnRegChanged(); + } + } + } + finally + { + if (registryKey != IntPtr.Zero) + { + RegCloseKey(registryKey); + } + } + } + } + + /// + /// Filter for notifications reported by . + /// + [Flags] + public enum RegChangeNotifyFilter + { + /// Notify the caller if a subkey is added or deleted. + Key = 1, + /// Notify the caller of changes to the attributes of the key, + /// such as the security descriptor information. + Attribute = 2, + /// Notify the caller of changes to a value of the key. This can + /// include adding or deleting a value, or changing an existing value. + Value = 4, + /// Notify the caller of changes to the security descriptor + /// of the key. + Security = 8, + } +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/Preferences/RegistryMonitor.cs.meta b/Assets/Plugins/CodeAssist/Editor/Preferences/RegistryMonitor.cs.meta new file mode 100644 index 00000000..7542820f --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/Preferences/RegistryMonitor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 62c915affb562104382b798d0baee4dc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/ScriptFinder.cs b/Assets/Plugins/CodeAssist/Editor/ScriptFinder.cs new file mode 100644 index 00000000..fe1e7606 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ScriptFinder.cs @@ -0,0 +1,312 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using System.Linq; +using UnityEngine; +using UnityEditor; +using UnityEditor.SceneManagement; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +#pragma warning restore IDE0005 + + +#nullable enable + + +namespace Meryel.UnityCodeAssist.Editor +{ + + public class ScriptFinder //: MonoBehaviour + { + + static Type? GetType123(string typeName) + { + //**-- + //**-- + /* + * for performance, + * check assembly-csharp, assembly-csharp-editor, assembly-csharp-first-pass,assembly-csharp-editor-first-pass + * first, (then maybe asmdef dlls), then check mscorlib and other referenced dlls + */ + + + //**--use typecache??? + //TypeCache + + //**--check this again + //https://github.com/Unity-Technologies/SuperScience/blob/main/Editor/GlobalNamespaceWatcher.cs + + // Try Type.GetType() first. This will work with types defined + // by the Mono runtime, in the same assembly as the caller, etc. + Type type = Type.GetType(typeName); + + // If it worked, then we're done here + if (type != null) + { + return type; + } + + // Attempt to search for type on the loaded assemblies + Assembly[] currentAssemblies = AppDomain.CurrentDomain.GetAssemblies(); + foreach (Assembly assembly in currentAssemblies) + { + type = assembly.GetType(typeName); + if (type != null) + { + return type; + } + } + + // If we still haven't found the proper type, we can enumerate all of the + // loaded assemblies and see if any of them define the type + var currentAssembly = Assembly.GetExecutingAssembly(); + var referencedAssemblies = currentAssembly.GetReferencedAssemblies(); + foreach (var assemblyName in referencedAssemblies) + { + // Load the referenced assembly + var assembly = Assembly.Load(assemblyName); + if (assembly != null) + { + // See if that assembly defines the named type + type = assembly.GetType(typeName); + if (type != null) + { + return type; + } + } + } + + // The type just couldn't be found... + return null; + } + + public static bool FindInstanceOfType(string typeName, string docPath, out GameObject? gameObjectInstanceOfType, out ScriptableObject? scriptableObjectInstanceOfType) + { + gameObjectInstanceOfType = null; + scriptableObjectInstanceOfType = null; + + var type = GetType123(typeName); + + if (type == null) + { + // Possibly a class has been created in Visual Studio, and these changes are not reflected in Unity domain yet + // We can force Unity to recompile and get the type, but since there will be no instance of that type, it won't be of any use, will be just a performance burden + Serilog.Log.Debug("{Type} type couldn't be found", typeName); + return false; + } + + + var obj = GetObjectOfType(type, out var requestVerboseType); + if (requestVerboseType) + NetMQInitializer.Publisher?.SendRequestVerboseType(typeName, docPath); + + if (obj != null && obj is GameObject go) + { + gameObjectInstanceOfType = go; + return true; + } + else if (obj != null && obj is ScriptableObject so) + { + scriptableObjectInstanceOfType = so; + return true; + } + + Serilog.Log.Debug("Instance of {Type} type couldn't be found", typeName); + return false; + } + + static UnityEngine.Object? GetObjectOfType(Type type, out bool requestVerboseType) + { + requestVerboseType = false; + var isMonoBehaviour = type.IsSubclassOf(typeof(MonoBehaviour)); + var isScriptableObject = type.IsSubclassOf(typeof(ScriptableObject)); + + if (!isMonoBehaviour && !isScriptableObject) + { + // Possibly a class's base class changed from none to MonoBehaviour in Visual Studio, and these changes are not reflected in Unity domain yet + // We can force Unity to recompile and get the type correctly, but since there will be no instance of that type, it won't be of any use, will be just a performance burden + Serilog.Log.Debug("{Type} is not a valid Unity object", type.ToString()); + //requestVerboseType = true; + return null; + } + + UnityEngine.Object? obj; + + obj = getObjectToSend(Selection.activeGameObject, type); + if (obj != null) + return obj; + + + obj = getObjectToSend(Selection.activeTransform, type); + if (obj != null) + return obj; + + + obj = getObjectToSend(Selection.activeObject, type); + if (obj != null) + return obj; + + + //**--check source code of this, for sorting + var filteredArray = Selection.GetFiltered(type, SelectionMode.Unfiltered); + if (filteredArray != null) + { + //**--sort + foreach (var filtered in filteredArray) + { + obj = getObjectToSend(filtered, type); + if (obj != null) + return obj; + } + } + + + + //**--rest can be slow, try avoiding them, make own db etc + //**--can add a stop-wacher and add warning if slow as well + //**--can also cache the result + + try + { + // UnityEngine.Object.FindObjectOfType is deprecated in new versions of Unity +#if UNITY_2022_3 || UNITY_2023_1_OR_NEWER + // Object.FindAnyObjectOfType doesn't return Assets (for example meshes, textures, or prefabs), or inactive objects. It also doesn't return objects that have HideFlags.DontSave set. + obj = UnityEngine.Object.FindAnyObjectByType(type); +#else + // Object.FindObjectOfType will not return Assets (meshes, textures, prefabs, ...) or inactive objects. It will not return an object that has HideFlags.DontSave set. + obj = UnityEngine.Object.FindObjectOfType(type); +#endif + } + catch (Exception ex) + { + Serilog.Log.Warning(ex, "FindObjectOfType/FindAnyObjectByType failed for {Type}, mb:{isMB}, so:{isSO}", type.ToString(), isMonoBehaviour, isScriptableObject); + } + + obj = getObjectToSend(obj, type); + if (obj != null) + return obj; + + UnityEngine.Object[]? arr = null; + try + { + // This function can return any type of Unity object that is loaded, including game objects, prefabs, materials, meshes, textures, etc. + // Contrary to Object.FindObjectsOfType this function will also list disabled objects. + arr = Resources.FindObjectsOfTypeAll(type); + } + catch (Exception ex) + { + //var isMonoBehaviour = type.IsSubclassOf(typeof(MonoBehaviour)); + //var isScriptableObject = type.IsSubclassOf(typeof(ScriptableObject)); + Serilog.Log.Warning(ex, "FindObjectsOfTypeAll failed for {Type}, mb:{isMB}, so:{isSO}", type.ToString(), isMonoBehaviour, isScriptableObject); + } + + if (arr != null) + { + //**--sort + foreach (var item in arr) + { + obj = getObjectToSend(item, type); + if (obj != null) + return obj; + } + } + + + return obj; + + + static UnityEngine.Object? getObjectToSend(UnityEngine.Object? obj, Type type) + { + if (obj == null || !obj) + return null; + + if (obj is GameObject go) + { + if (!go) + return null; + if (isTypeComponent(type) && go.GetComponent(type) != null) + return go; + } + else if (obj is Transform transform) + { + go = transform.gameObject; + if (!go) + return null; + if (isTypeComponent(type) && go.GetComponent(type) != null) + return go; + } + else if (obj is Component comp) + { + go = comp.gameObject; + if (!go) + return null; + else + return go; + } + else if (obj is ScriptableObject so) + { + if (!so) + return null; + else + return so; + } + + return null; + } + + static bool isTypeComponent(Type type) + { + var componentType = typeof(Component);//**--cache these types + if (type == componentType || type.IsSubclassOf(componentType)) + return true; + + // MonoBehaviour is Component, so below is unnecessary + //var monoBehaviourType = typeof(MonoBehaviour); + //if (type == monoBehaviourType || type.IsSubclassOf(monoBehaviourType)) + // return true; + + //else if(type is interface)//**-- + + return false; + } + } + + public static void DENEMEEEE() + { + //UnityEditor.SceneManagement.EditorSceneManager.all + //AssetDatabase.get + + foreach (var sceneGUID in AssetDatabase.FindAssets("t:Scene", new string[] { "Assets" })) + { + var scenePath = AssetDatabase.GUIDToAssetPath(sceneGUID); + Debug.Log("scenePath: " + scenePath); + + //EditorSceneManager.OpenScene(scenePath); + //var scene = EditorSceneManager.GetActiveScene(); + } + + var assets = AssetDatabase.FindAssets("Deneme_OtherScene"); + Debug.Log("Assets: " + assets.Length); + + foreach (var assetGuid in assets) + { + var assetPath = AssetDatabase.GUIDToAssetPath(assetGuid); + Debug.Log("Asset: " + assetGuid + " " + assetPath); + + + } + } + + public static bool GetActiveGameObject(out GameObject activeGameObject) + { + activeGameObject = Selection.activeGameObject; + return activeGameObject ? true : false; + } + + } + + +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/ScriptFinder.cs.meta b/Assets/Plugins/CodeAssist/Editor/ScriptFinder.cs.meta new file mode 100644 index 00000000..0a39b5b5 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/ScriptFinder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 01fc60f0773a7f74dab38e4342faf7e9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/StatusWindow.cs b/Assets/Plugins/CodeAssist/Editor/StatusWindow.cs new file mode 100644 index 00000000..581bb53e --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/StatusWindow.cs @@ -0,0 +1,86 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; +using UnityEditor; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +#pragma warning restore IDE0005 + + +#nullable enable + + +namespace Meryel.UnityCodeAssist.Editor +{ + public class StatusWindow : EditorWindow + { + GUIStyle? styleLabel; + + public static void Display() + { + // Get existing open window or if none, make a new one: + var window = GetWindow(); + window.Show(); + + NetMQInitializer.Publisher?.SendConnectionInfo(); + + Serilog.Log.Debug("Displaying status window"); + + NetMQInitializer.Publisher?.SendAnalyticsEvent("Gui", "StatusWindow_Display"); + } + + private void OnEnable() + { + //**--icon + //var icon = AssetDatabase.LoadAssetAtPath("Assets/Sprites/Gear.png"); + //titleContent = new GUIContent("Code Assist", icon); + titleContent = new GUIContent(Assister.Title); + } + + private void OnGUI() + { + var hasAnyClient = NetMQInitializer.Publisher?.clients.Any() == true; + + styleLabel ??= new GUIStyle(GUI.skin.label) + { + wordWrap = true, + alignment = TextAnchor.MiddleLeft, + }; + + if (hasAnyClient) + { + EditorGUILayout.LabelField($"Code Assist is working!", styleLabel, GUILayout.ExpandWidth(true)); + + foreach (var client in NetMQInitializer.Publisher!.clients) + { + EditorGUILayout.LabelField($"Connected to {client.ContactInfo}", styleLabel, GUILayout.ExpandWidth(true)); + } + } + else + { + EditorGUILayout.LabelField($"Code Assist isn't working!", styleLabel, GUILayout.ExpandWidth(true)); + + EditorGUILayout.LabelField($"No IDE found", styleLabel, GUILayout.ExpandWidth(true)); + } + +#if MERYEL_UCA_LITE_VERSION + + EditorGUILayout.LabelField($"", styleLabel, GUILayout.ExpandWidth(true)); + EditorGUILayout.LabelField($"This is the lite version of Code Assist with limited features.", styleLabel, GUILayout.ExpandWidth(true)); + EditorGUILayout.LabelField($"To unlock all of the features, get the full version.", styleLabel, GUILayout.ExpandWidth(true)); + + if (GUILayout.Button("Get full version")) + { + Application.OpenURL("http://u3d.as/2N2H"); + } + +#endif // MERYEL_UCA_LITE_VERSION + + + } + } + +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/StatusWindow.cs.meta b/Assets/Plugins/CodeAssist/Editor/StatusWindow.cs.meta new file mode 100644 index 00000000..7236d7f5 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/StatusWindow.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 485f701946e9408459533bd7ed3e3696 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/TinyJson.meta b/Assets/Plugins/CodeAssist/Editor/TinyJson.meta new file mode 100644 index 00000000..e53f0b65 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/TinyJson.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cf0577f4cfbdbf542926b0600bbb8518 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/TinyJson/JsonParser.cs b/Assets/Plugins/CodeAssist/Editor/TinyJson/JsonParser.cs new file mode 100644 index 00000000..55fca219 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/TinyJson/JsonParser.cs @@ -0,0 +1,376 @@ +// copied from +// https://github.com/zanders3/json/blob/master/src/JSONParser.cs + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using System.Runtime.Serialization; +using System.Text; + +//namespace TinyJson +namespace Meryel.UnityCodeAssist.Editor.TinyJson +{ + // Really simple JSON parser in ~300 lines + // - Attempts to parse JSON files with minimal GC allocation + // - Nice and simple "[1,2,3]".FromJson>() API + // - Classes and structs can be parsed too! + // class Foo { public int Value; } + // "{\"Value\":10}".FromJson() + // - Can parse JSON without type information into Dictionary and List e.g. + // "[1,2,3]".FromJson().GetType() == typeof(List) + // "{\"Value\":10}".FromJson().GetType() == typeof(Dictionary) + // - No JIT Emit support to support AOT compilation on iOS + // - Attempts are made to NOT throw an exception if the JSON is corrupted or invalid: returns null instead. + // - Only public fields and property setters on classes/structs will be written to + // + // Limitations: + // - No JIT Emit support to parse structures quickly + // - Limited to parsing <2GB JSON files (due to int.MaxValue) + // - Parsing of abstract classes or interfaces is NOT supported and will throw an exception. + public static class JsonParser + { + [ThreadStatic] static Stack> splitArrayPool; + [ThreadStatic] static StringBuilder stringBuilder; + [ThreadStatic] static Dictionary> fieldInfoCache; + [ThreadStatic] static Dictionary> propertyInfoCache; + + //public static T FromJson(this string json) + public static T FromJson(string json) + { + // Initialize, if needed, the ThreadStatic variables + propertyInfoCache ??= new Dictionary>(); + fieldInfoCache ??= new Dictionary>(); + stringBuilder ??= new StringBuilder(); + splitArrayPool ??= new Stack>(); + + //Remove all whitespace not within strings to make parsing simpler + stringBuilder.Length = 0; + for (int i = 0; i < json.Length; i++) + { + char c = json[i]; + if (c == '"') + { + i = AppendUntilStringEnd(true, i, json); + continue; + } + if (char.IsWhiteSpace(c)) + continue; + + stringBuilder.Append(c); + } + + //Parse the thing! + return (T)ParseValue(typeof(T), stringBuilder.ToString()); + } + + static int AppendUntilStringEnd(bool appendEscapeCharacter, int startIdx, string json) + { + stringBuilder.Append(json[startIdx]); + for (int i = startIdx + 1; i < json.Length; i++) + { + if (json[i] == '\\') + { + if (appendEscapeCharacter) + stringBuilder.Append(json[i]); + stringBuilder.Append(json[i + 1]); + i++;//Skip next character as it is escaped + } + else if (json[i] == '"') + { + stringBuilder.Append(json[i]); + return i; + } + else + stringBuilder.Append(json[i]); + } + return json.Length - 1; + } + + //Splits { :, : } and [ , ] into a list of strings + static List Split(string json) + { + List splitArray = splitArrayPool.Count > 0 ? splitArrayPool.Pop() : new List(); + splitArray.Clear(); + if (json.Length == 2) + return splitArray; + int parseDepth = 0; + stringBuilder.Length = 0; + for (int i = 1; i < json.Length - 1; i++) + { + switch (json[i]) + { + case '[': + case '{': + parseDepth++; + break; + case ']': + case '}': + parseDepth--; + break; + case '"': + i = AppendUntilStringEnd(true, i, json); + continue; + case ',': + case ':': + if (parseDepth == 0) + { + splitArray.Add(stringBuilder.ToString()); + stringBuilder.Length = 0; + continue; + } + break; + } + + stringBuilder.Append(json[i]); + } + + splitArray.Add(stringBuilder.ToString()); + + return splitArray; + } + + internal static object ParseValue(Type type, string json) + { + if (type == typeof(string)) + { + if (json.Length <= 2) + return string.Empty; + StringBuilder parseStringBuilder = new StringBuilder(json.Length); + for (int i = 1; i < json.Length - 1; ++i) + { + if (json[i] == '\\' && i + 1 < json.Length - 1) + { + int j = "\"\\nrtbf/".IndexOf(json[i + 1]); + if (j >= 0) + { + parseStringBuilder.Append("\"\\\n\r\t\b\f/"[j]); + ++i; + continue; + } + if (json[i + 1] == 'u' && i + 5 < json.Length - 1) + { + //UInt32 c = 0; + if (UInt32.TryParse(json.Substring(i + 2, 4), System.Globalization.NumberStyles.AllowHexSpecifier, null, out UInt32 c)) + { + parseStringBuilder.Append((char)c); + i += 5; + continue; + } + } + } + parseStringBuilder.Append(json[i]); + } + return parseStringBuilder.ToString(); + } + if (type.IsPrimitive) + { + var result = Convert.ChangeType(json, type, System.Globalization.CultureInfo.InvariantCulture); + return result; + } + if (type == typeof(decimal)) + { + decimal.TryParse(json, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out decimal result); + return result; + } + if (type == typeof(DateTime)) + { + DateTime.TryParse(json.Replace("\"", ""), System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out DateTime result); + return result; + } + if (json == "null") + { + return null; + } + if (type.IsEnum) + { + if (json[0] == '"') + json = json.Substring(1, json.Length - 2); + try + { + return Enum.Parse(type, json, false); + } + catch + { + return 0; + } + } + if (type.IsArray) + { + Type arrayType = type.GetElementType(); + if (json[0] != '[' || json[json.Length - 1] != ']') + return null; + + List elems = Split(json); + Array newArray = Array.CreateInstance(arrayType, elems.Count); + for (int i = 0; i < elems.Count; i++) + newArray.SetValue(ParseValue(arrayType, elems[i]), i); + splitArrayPool.Push(elems); + return newArray; + } + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>)) + { + Type listType = type.GetGenericArguments()[0]; + if (json[0] != '[' || json[json.Length - 1] != ']') + return null; + + List elems = Split(json); + var list = (IList)type.GetConstructor(new Type[] { typeof(int) }).Invoke(new object[] { elems.Count }); + for (int i = 0; i < elems.Count; i++) + list.Add(ParseValue(listType, elems[i])); + splitArrayPool.Push(elems); + return list; + } + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Dictionary<,>)) + { + Type keyType, valueType; + { + Type[] args = type.GetGenericArguments(); + keyType = args[0]; + valueType = args[1]; + } + + //Refuse to parse dictionary keys that aren't of type string + if (keyType != typeof(string)) + return null; + //Must be a valid dictionary element + if (json[0] != '{' || json[json.Length - 1] != '}') + return null; + //The list is split into key/value pairs only, this means the split must be divisible by 2 to be valid JSON + List elems = Split(json); + if (elems.Count % 2 != 0) + return null; + + var dictionary = (IDictionary)type.GetConstructor(new Type[] { typeof(int) }).Invoke(new object[] { elems.Count / 2 }); + for (int i = 0; i < elems.Count; i += 2) + { + if (elems[i].Length <= 2) + continue; + string keyValue = elems[i].Substring(1, elems[i].Length - 2); + object val = ParseValue(valueType, elems[i + 1]); + dictionary[keyValue] = val; + } + return dictionary; + } + if (type == typeof(object)) + { + return ParseAnonymousValue(json); + } + if (json[0] == '{' && json[json.Length - 1] == '}') + { + return ParseObject(type, json); + } + + return null; + } + + static object ParseAnonymousValue(string json) + { + if (json.Length == 0) + return null; + if (json[0] == '{' && json[json.Length - 1] == '}') + { + List elems = Split(json); + if (elems.Count % 2 != 0) + return null; + var dict = new Dictionary(elems.Count / 2); + for (int i = 0; i < elems.Count; i += 2) + dict[elems[i].Substring(1, elems[i].Length - 2)] = ParseAnonymousValue(elems[i + 1]); + return dict; + } + if (json[0] == '[' && json[json.Length - 1] == ']') + { + List items = Split(json); + var finalList = new List(items.Count); + for (int i = 0; i < items.Count; i++) + finalList.Add(ParseAnonymousValue(items[i])); + return finalList; + } + if (json[0] == '"' && json[json.Length - 1] == '"') + { + string str = json.Substring(1, json.Length - 2); + return str.Replace("\\", string.Empty); + } + if (char.IsDigit(json[0]) || json[0] == '-') + { + if (json.Contains(".")) + { + double.TryParse(json, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out double result); + return result; + } + else + { + int.TryParse(json, out int result); + return result; + } + } + if (json == "true") + return true; + if (json == "false") + return false; + // handles json == "null" as well as invalid JSON + return null; + } + + static Dictionary CreateMemberNameDictionary(T[] members) where T : MemberInfo + { + Dictionary nameToMember = new Dictionary(StringComparer.OrdinalIgnoreCase); + for (int i = 0; i < members.Length; i++) + { + T member = members[i]; + if (member.IsDefined(typeof(IgnoreDataMemberAttribute), true)) + continue; + + string name = member.Name; + if (member.IsDefined(typeof(DataMemberAttribute), true)) + { + DataMemberAttribute dataMemberAttribute = (DataMemberAttribute)Attribute.GetCustomAttribute(member, typeof(DataMemberAttribute), true); + if (!string.IsNullOrEmpty(dataMemberAttribute.Name)) + name = dataMemberAttribute.Name; + } + + nameToMember.Add(name, member); + } + + return nameToMember; + } + + static object ParseObject(Type type, string json) + { + object instance = FormatterServices.GetUninitializedObject(type); + + //The list is split into key/value pairs only, this means the split must be divisible by 2 to be valid JSON + List elems = Split(json); + if (elems.Count % 2 != 0) + return instance; + + //Dictionary nameToField; + //Dictionary nameToProperty; + if (!fieldInfoCache.TryGetValue(type, out var nameToField)) + { + nameToField = CreateMemberNameDictionary(type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy)); + fieldInfoCache.Add(type, nameToField); + } + if (!propertyInfoCache.TryGetValue(type, out var nameToProperty)) + { + nameToProperty = CreateMemberNameDictionary(type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy)); + propertyInfoCache.Add(type, nameToProperty); + } + + for (int i = 0; i < elems.Count; i += 2) + { + if (elems[i].Length <= 2) + continue; + string key = elems[i].Substring(1, elems[i].Length - 2); + string value = elems[i + 1]; + + if (nameToField.TryGetValue(key, out FieldInfo fieldInfo)) + fieldInfo.SetValue(instance, ParseValue(fieldInfo.FieldType, value)); + else if (nameToProperty.TryGetValue(key, out PropertyInfo propertyInfo)) + propertyInfo.SetValue(instance, ParseValue(propertyInfo.PropertyType, value), null); + } + + return instance; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/TinyJson/JsonParser.cs.meta b/Assets/Plugins/CodeAssist/Editor/TinyJson/JsonParser.cs.meta new file mode 100644 index 00000000..11f4c0a7 --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/TinyJson/JsonParser.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7fca0b1af37486445bb4d05a791bcb31 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/TinyJson/JsonWriter.cs b/Assets/Plugins/CodeAssist/Editor/TinyJson/JsonWriter.cs new file mode 100644 index 00000000..8c6addac --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/TinyJson/JsonWriter.cs @@ -0,0 +1,202 @@ +// copied from +// https://github.com/zanders3/json/blob/master/src/JSONWriter.cs + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using System.Runtime.Serialization; +using System.Text; + +//namespace TinyJson +namespace Meryel.UnityCodeAssist.Editor.TinyJson +{ + //Really simple JSON writer + //- Outputs JSON structures from an object + //- Really simple API (new List { 1, 2, 3 }).ToJson() == "[1,2,3]" + //- Will only output public fields and property getters on objects + //public static class JSONWriter + public static class JsonWriter + { + //public static string ToJson(this object item) + public static string ToJson(object item) + { + StringBuilder stringBuilder = new StringBuilder(); + AppendValue(stringBuilder, item); + return stringBuilder.ToString(); + } + + static void AppendValue(StringBuilder stringBuilder, object item) + { + if (item == null) + { + stringBuilder.Append("null"); + return; + } + + Type type = item.GetType(); + if (type == typeof(string) || type == typeof(char)) + { + stringBuilder.Append('"'); + string str = item.ToString(); + for (int i = 0; i < str.Length; ++i) + if (str[i] < ' ' || str[i] == '"' || str[i] == '\\') + { + stringBuilder.Append('\\'); + int j = "\"\\\n\r\t\b\f".IndexOf(str[i]); + if (j >= 0) + stringBuilder.Append("\"\\nrtbf"[j]); + else + stringBuilder.AppendFormat("u{0:X4}", (UInt32)str[i]); + } + else + stringBuilder.Append(str[i]); + stringBuilder.Append('"'); + } + else if (type == typeof(byte) || type == typeof(sbyte)) + { + stringBuilder.Append(item.ToString()); + } + else if (type == typeof(short) || type == typeof(ushort)) + { + stringBuilder.Append(item.ToString()); + } + else if (type == typeof(int) || type == typeof(uint)) + { + stringBuilder.Append(item.ToString()); + } + else if (type == typeof(long) || type == typeof(ulong)) + { + stringBuilder.Append(item.ToString()); + } + else if (type == typeof(float)) + { + stringBuilder.Append(((float)item).ToString(System.Globalization.CultureInfo.InvariantCulture)); + } + else if (type == typeof(double)) + { + stringBuilder.Append(((double)item).ToString(System.Globalization.CultureInfo.InvariantCulture)); + } + else if (type == typeof(decimal)) + { + stringBuilder.Append(((decimal)item).ToString(System.Globalization.CultureInfo.InvariantCulture)); + } + else if (type == typeof(bool)) + { + stringBuilder.Append(((bool)item) ? "true" : "false"); + } + else if (type == typeof(DateTime)) + { + stringBuilder.Append('"'); + stringBuilder.Append(((DateTime)item).ToString(System.Globalization.CultureInfo.InvariantCulture)); + stringBuilder.Append('"'); + } + else if (type.IsEnum) + { + stringBuilder.Append('"'); + stringBuilder.Append(item.ToString()); + stringBuilder.Append('"'); + } + else if (item is IList) + { + stringBuilder.Append('['); + bool isFirst = true; + IList list = item as IList; + for (int i = 0; i < list.Count; i++) + { + if (isFirst) + isFirst = false; + else + stringBuilder.Append(','); + AppendValue(stringBuilder, list[i]); + } + stringBuilder.Append(']'); + } + else if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Dictionary<,>)) + { + Type keyType = type.GetGenericArguments()[0]; + + //Refuse to output dictionary keys that aren't of type string + if (keyType != typeof(string)) + { + stringBuilder.Append("{}"); + return; + } + + stringBuilder.Append('{'); + IDictionary dict = item as IDictionary; + bool isFirst = true; + foreach (object key in dict.Keys) + { + if (isFirst) + isFirst = false; + else + stringBuilder.Append(','); + stringBuilder.Append('\"'); + stringBuilder.Append((string)key); + stringBuilder.Append("\":"); + AppendValue(stringBuilder, dict[key]); + } + stringBuilder.Append('}'); + } + else + { + stringBuilder.Append('{'); + + bool isFirst = true; + FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy); + for (int i = 0; i < fieldInfos.Length; i++) + { + if (fieldInfos[i].IsDefined(typeof(IgnoreDataMemberAttribute), true)) + continue; + + object value = fieldInfos[i].GetValue(item); + if (value != null) + { + if (isFirst) + isFirst = false; + else + stringBuilder.Append(','); + stringBuilder.Append('\"'); + stringBuilder.Append(GetMemberName(fieldInfos[i])); + stringBuilder.Append("\":"); + AppendValue(stringBuilder, value); + } + } + PropertyInfo[] propertyInfo = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy); + for (int i = 0; i < propertyInfo.Length; i++) + { + if (!propertyInfo[i].CanRead || propertyInfo[i].IsDefined(typeof(IgnoreDataMemberAttribute), true)) + continue; + + object value = propertyInfo[i].GetValue(item, null); + if (value != null) + { + if (isFirst) + isFirst = false; + else + stringBuilder.Append(','); + stringBuilder.Append('\"'); + stringBuilder.Append(GetMemberName(propertyInfo[i])); + stringBuilder.Append("\":"); + AppendValue(stringBuilder, value); + } + } + + stringBuilder.Append('}'); + } + } + + static string GetMemberName(MemberInfo member) + { + if (member.IsDefined(typeof(DataMemberAttribute), true)) + { + DataMemberAttribute dataMemberAttribute = (DataMemberAttribute)Attribute.GetCustomAttribute(member, typeof(DataMemberAttribute), true); + if (!string.IsNullOrEmpty(dataMemberAttribute.Name)) + return dataMemberAttribute.Name; + } + + return member.Name; + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/Editor/TinyJson/JsonWriter.cs.meta b/Assets/Plugins/CodeAssist/Editor/TinyJson/JsonWriter.cs.meta new file mode 100644 index 00000000..55a0b17b --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/TinyJson/JsonWriter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4a5fc21134aec884ab216fb00de17530 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/UnityClassExtensions.cs b/Assets/Plugins/CodeAssist/Editor/UnityClassExtensions.cs new file mode 100644 index 00000000..d043351e --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/UnityClassExtensions.cs @@ -0,0 +1,327 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using UnityEngine; +using UnityEditor; + + +#pragma warning disable IDE0005 +using Serilog = Meryel.UnityCodeAssist.Serilog; +#pragma warning restore IDE0005 + + +#nullable enable + + +namespace Meryel.UnityCodeAssist.Editor +{ + internal static class UnityClassExtensions + { + static GameObject? GetParentGO(GameObject go) + { + if (!go) + return null; + + var parentTransform = go.transform.parent; + + if (parentTransform && parentTransform.gameObject) + return parentTransform.gameObject; + else + return null; + } + + static string GetId(UnityEngine.Object? obj) + { + try + { + // obj can be null + + var globalObjectId = GlobalObjectId.GetGlobalObjectIdSlow(obj); + var objectGuid = globalObjectId.ToString(); + return objectGuid; + } + catch (Exception ex) + { + // OnBeforeSerialize of user scripts may raise exception + Serilog.Log.Warning(ex, "GetGlobalObjectIdSlow failed for obj {Obj}", obj); + return "GlobalObjectId_V1-0-00000000000000000000000000000000-0-0"; + } + } + + internal static Synchronizer.Model.GameObject? ToSyncModel(this GameObject go, int priority = 0) + { + if (!go) + return null; + + var data = new Synchronizer.Model.GameObject() + { + Id = GetId(go), + + Name = go.name, + Layer = go.layer.ToString(), + Tag = go.tag, + Scene = go.scene.name, + + ParentId = GetId(GetParentGO(go)), + ChildrenIds = getChildrenIds(go), + + Components = getComponents(go), + + Priority = priority, + }; + return data; + + static string[] getChildrenIds(GameObject g) + { + var ids = new List(); + var limit = 10;//**-- + foreach (Transform child in g.transform) + { + if (!child || !child.gameObject) + continue; + + ids.Add(GetId(child.gameObject)); + + if (--limit <= 0) + break; + } + return ids.ToArray(); + } + + //**--limit/10 + static string[] getComponents(GameObject g) => + g.GetComponents().Where(c => c).Select(c => c.GetType().FullName).Take(10).ToArray(); + /*(string[] componentNames, Synchronizer.Model.ComponentData[] componentData) getComponents(GameObject g) + { + var components = g.GetComponents(); + var names = components.Select(c => c.name).ToArray(); + + var data = new List(); + foreach (var comp in components) + { + var name = comp.name; + + + } + + return (names, data.ToArray()); + }*/ + } + + internal static Synchronizer.Model.GameObject[]? ToSyncModelOfHierarchy(this GameObject go) + { + if (!go) + return null; + + var list = new List(); + + var parent = GetParentGO(go); + if (parent != null && parent) + { + var parentModel = parent.ToSyncModel(); + if (parentModel != null) + list.Add(parentModel); + } + + int limit = 10; + foreach (Transform child in go.transform) + { + if (!child || !child.gameObject) + continue; + + var childModel = child.gameObject.ToSyncModel(); + if (childModel == null) + continue; + + list.Add(childModel); + + if (--limit <= 0) + break; + } + + return list.ToArray(); + } + + internal static Synchronizer.Model.ComponentData[]? ToSyncModelOfComponents(this GameObject go) + { + if (!go) + return null; + + var limit = 10;//**-- + return go.GetComponents().Where(c => c).Select(c => c.ToSyncModel(go)).Where(cd => cd != null).Take(limit).ToArray()!; + + /* + var components = go.GetComponents(); + var len = components.Count(c => c != null); + len = Math.Min(len, limit);//**--limit + + var array = new Synchronizer.Model.ComponentData[len]; + + var arrayIndex = 0; + foreach (var component in components) + { + if (component == null) + continue; + + array[arrayIndex++] = component.ToSyncModel(go); + + if (arrayIndex >= len) + break; + } + + return array; + */ + } + + internal static Synchronizer.Model.ComponentData? ToSyncModel(this Component component, GameObject go) + { + if (!component || !go) + return null; + + Type type = component.GetType(); + var list = new List<(string, string)>(); + ShowFieldInfo(type, component, list); + + var data = new Synchronizer.Model.ComponentData() + { + GameObjectId = GetId(go), + Component = component.GetType().FullName, + Type = Synchronizer.Model.ComponentData.DataType.Component, + Data = list.ToArray(), + }; + return data; + } + + internal static Synchronizer.Model.ComponentData? ToSyncModel(this ScriptableObject so) + { + if (!so) + return null; + + Type type = so.GetType(); + var list = new List<(string, string)>(); + ShowFieldInfo(type, so, list); + + var data = new Synchronizer.Model.ComponentData() + { + GameObjectId = GetId(so), + Component = so.GetType().FullName, + Type = Synchronizer.Model.ComponentData.DataType.ScriptableObject, + Data = list.ToArray(), + }; + return data; + } + + + static bool IsTypeCompatible(Type type) + { + if (type == null || !(type.IsSubclassOf(typeof(MonoBehaviour)) || type.IsSubclassOf(typeof(ScriptableObject)))) + return false; + return true; + } + + static void ShowFieldInfo(Type type)//, MonoImporter importer, List names, List objects, ref bool didModify) + { + // Only show default properties for types that support it (so far only MonoBehaviour derived types) + if (!IsTypeCompatible(type)) + return; + + ShowFieldInfo(type.BaseType);//, importer, names, objects, ref didModify); + + FieldInfo[] infos = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly); + foreach (FieldInfo field in infos) + { + if (!field.IsPublic) + { + object[] attr = field.GetCustomAttributes(typeof(SerializeField), true); + if (attr == null || attr.Length == 0) + continue; + } + + /* + if (field.FieldType.IsSubclassOf(typeof(Object)) || field.FieldType == typeof(Object)) + { + Object oldTarget = importer.GetDefaultReference(field.Name); + Object newTarget = EditorGUILayout.ObjectField(ObjectNames.NicifyVariableName(field.Name), oldTarget, field.FieldType, false); + + names.Add(field.Name); + objects.Add(newTarget); + + if (oldTarget != newTarget) + didModify = true; + } + */ + + if (field.FieldType.IsValueType && field.FieldType.IsPrimitive && !field.FieldType.IsEnum) + { + + } + else if (field.FieldType == typeof(string)) + { + + } + } + } + + static void ShowFieldInfo(Type type, UnityEngine.Object unityObjectInstance, List<(string, string)> fields)//, MonoImporter importer, List names, List objects, ref bool didModify) + { + // Only show default properties for types that support it (so far only MonoBehaviour derived types) + if (!IsTypeCompatible(type)) + return; + + if (!unityObjectInstance) + return; + + ShowFieldInfo(type.BaseType, unityObjectInstance, fields);//, importer, names, objects, ref didModify); + + FieldInfo[] infos = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly); + foreach (FieldInfo field in infos) + { + if (!field.IsPublic) + { + object[] attr = field.GetCustomAttributes(typeof(SerializeField), true); + if (attr == null || attr.Length == 0) + continue; + } + + // check attribute [HideInInspector] + { + object[] attr = field.GetCustomAttributes(typeof(HideInInspector), true); + if (attr != null && attr.Length > 0) + continue; + } + + // readonly + if (field.IsInitOnly) + continue; + + + /* + if (field.FieldType.IsSubclassOf(typeof(Object)) || field.FieldType == typeof(Object)) + { + Object oldTarget = importer.GetDefaultReference(field.Name); + Object newTarget = EditorGUILayout.ObjectField(ObjectNames.NicifyVariableName(field.Name), oldTarget, field.FieldType, false); + + names.Add(field.Name); + objects.Add(newTarget); + + if (oldTarget != newTarget) + didModify = true; + } + */ + + if (field.FieldType.IsValueType && field.FieldType.IsPrimitive && !field.FieldType.IsEnum) + { + var val = field.GetValue(unityObjectInstance); + fields.Add((field.Name, val.ToString()));//**--culture + } + else if (field.FieldType == typeof(string)) + { + var val = (string)field.GetValue(unityObjectInstance); + fields.Add((field.Name, val)); + } + } + } + + } +} diff --git a/Assets/Plugins/CodeAssist/Editor/UnityClassExtensions.cs.meta b/Assets/Plugins/CodeAssist/Editor/UnityClassExtensions.cs.meta new file mode 100644 index 00000000..1dac07fb --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/UnityClassExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 83ed11e1a1c63634c9aa6da62949c0af +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/Editor/csc.rsp b/Assets/Plugins/CodeAssist/Editor/csc.rsp new file mode 100644 index 00000000..80dc562b --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/csc.rsp @@ -0,0 +1 @@ +-define:MERYEL_UCA_LITE_VERSION diff --git a/Assets/Plugins/CodeAssist/Editor/csc.rsp.meta b/Assets/Plugins/CodeAssist/Editor/csc.rsp.meta new file mode 100644 index 00000000..471161fe --- /dev/null +++ b/Assets/Plugins/CodeAssist/Editor/csc.rsp.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9cbe0a0b271b8a748855d22a25fa2ddc +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/GPT-NOTICE.TXT b/Assets/Plugins/CodeAssist/GPT-NOTICE.TXT new file mode 100644 index 00000000..98e8641a --- /dev/null +++ b/Assets/Plugins/CodeAssist/GPT-NOTICE.TXT @@ -0,0 +1,17 @@ +Generative AI is one of the features of Code Assist. If you have any ethical or legal concerns, you can use Code Assist without this feature by disabling generative AI in the options. + +You need an OpenAI account and provide it's API key to this asset. +https://platform.openai.com/account/api-keys + +Provide key by one of the below +* Create an environment variable called OPENAI_API_KEY with the API key +* Create a file with name .openai under user profile directory with the API key +* Set API key in Visual Studio options, Tools->Options->Unity Code Assist->Generative AI->Authentication + +This asset has one-time purchase fee, but you may need to pay extra for OpenAI services to use Generative AI feature. +https://openai.com/pricing + +To use generative AI with your comments: +* Type "//gpt " +* Type your prompt +* Press Enter key \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/GPT-NOTICE.TXT.meta b/Assets/Plugins/CodeAssist/GPT-NOTICE.TXT.meta new file mode 100644 index 00000000..633b0134 --- /dev/null +++ b/Assets/Plugins/CodeAssist/GPT-NOTICE.TXT.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f3dcb1a6517fffc46b6b2867a4238e01 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/README.TXT b/Assets/Plugins/CodeAssist/README.TXT new file mode 100644 index 00000000..592fd047 --- /dev/null +++ b/Assets/Plugins/CodeAssist/README.TXT @@ -0,0 +1,90 @@ +Code Assist improves your coding experience with Visual Studio. Coding for Unity projects becomes easier and more efficient with fewer bugs. +Connect your game editor and IDE, let Unity and Visual Studio share data between each other. Enrich your coding experience with the new data available. + + + +Contact: +merryyellow@outlook.com + +Website: +https://unitycodeassist.netlify.app/ + +Discord: +https://discord.gg/2CgKHDq + +Forum: +https://forum.unity.com/threads/code-assist-empower-your-ide.1384731/ + +GitHub: +https://github.com/merryyellow/Unity-Code-Assist + +Asset Store: +http://u3d.as/2N2H + +Visual Studio Marketplace: +https://marketplace.visualstudio.com/items?itemName=MerryYellow.UCA-Lite + + + +Restrictions: +* Unity 2020.2 and newer. +* Visual Studio 2022. Does not work with Visual Studio Code, Visual Studio for Mac, Rider or any other IDE or text editor. + + + +How to Setup: +* Import the asset under folder "Assets" +* Install Meryel.UnityCodeAssist.VSIX.vsix under folder "Assets/Plugins/CodeAssist" (You can skip this step if you have installed it before for another project) +* Open your Unity project with Visual Studio. Code Assist loads in background with low priority, so it will be ready in a minute when Visual Studio first starts up. +* To check if setup is successfull, in Unity, choose "Tools"->"Code Assist"->"Status" from menu. The windows should display "Code Assist is working!". + + + +How to Use: +Code Assist is always active while you are coding. The following samples will give you a glimpse of Code Assist. +* Code Completion: In a class which derives MonoBehaviour, type "CompareTag(". When you press double quotes("), code completion popup should appear with the available tags of the scene. +* Inline Visuals: Type a color in hex code with quotation marks, like "#FF8800". A box with the matching color should appear left of the color code. +* Code Analyzers: Define a Vector3 (let's say vec3). When used like "if (vec3.magnitude < 10)", a warning will appear on that line. Press Alt+Enter to convert it to "if (vec3.sqrMagnitude < 10 * 10)", which has better performance. + + + +Generative AI: +Generative AI is one of the features of Code Assist. If you have any ethical or legal concerns, you can use Code Assist without this feature by disabling generative AI in the options. + +You need an OpenAI account and provide it's API key to this asset. +https://platform.openai.com/account/api-keys + +Provide key by one of the below +* Create an environment variable called OPENAI_API_KEY with the API key +* Create a file with name .openai under user profile directory with the API key +* Set API key in Visual Studio options, Tools->Options->Unity Code Assist->Generative AI->Authentication + +This asset has one-time purchase fee, but you may need to pay extra for OpenAI services to use Generative AI feature. +https://openai.com/pricing + +To use generative AI with your comments: +* Type "//gpt " +* Type your prompt +* Press Enter key + + + +Troubleshooting: +* Make sure in Unity, "Tools"->"Code Assist"->"Status" is available from the menu bar. If not, reimport the asset. +* Make sure in Visual Studio, "Extensions"->"Unity Code Assist"->Status is available from the menu bar. If not, reinstall the Meryel.UnityCodeAssist.VSIX.vsix file (under folder "Assets/Plugins/CodeAssist"). +* If Visual Studio has just been started, just wait; it usually takes around one minute to fully load Code Assist. +* If still not working, in Unity try "Tools"->"Code Assist"->"Synchronize" from the menu bar. This will attempt a new connection with Visual Studio. +* If none works above, try restarting both Unity and Visual Studio; sometimes an unclosed background thread blocks communication channels (network ports). + + + +Error Reporting: +* In Unity, choose "Tools"->"Code Assist"->"Report error" from the menu bar, to open feedback window. +* Or in Visual Studio, choose "Extensions"->"Unity Code Assist"->"Report error" from the menu bar, to open feedback window. +* In the feedback window, you can view the most recent logs, or view full log of Unity or Visual Studio. +* You can report the error via email ( merryyellow@outlook.com ) or Discord ( https://discord.gg/2CgKHDq ) or GitHub ( https://github.com/merryyellow/Unity-Code-Assist/issues/new ) +* Attaching full logs is recommended when reporting an error. + + + +Thank you for using Code Assist. We hope this will help you in your crazy journey called game development :) \ No newline at end of file diff --git a/Assets/Plugins/CodeAssist/README.TXT.meta b/Assets/Plugins/CodeAssist/README.TXT.meta new file mode 100644 index 00000000..2a702299 --- /dev/null +++ b/Assets/Plugins/CodeAssist/README.TXT.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9a017290edc651d4a90737450197c7eb +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/CodeAssist/THIRD-PARTY-NOTICES.TXT b/Assets/Plugins/CodeAssist/THIRD-PARTY-NOTICES.TXT new file mode 100644 index 00000000..c8153055 --- /dev/null +++ b/Assets/Plugins/CodeAssist/THIRD-PARTY-NOTICES.TXT @@ -0,0 +1,1395 @@ +This asset is governed by the Asset Store EULA; however, the following components are governed by the licenses indicated below: + + + + +A. roslyn-linq-rewrite +MIT License +https://github.com/antiufo/roslyn-linq-rewrite/blob/master/LICENSE.txt +------------------------------- +MIT License + +Copyright (c) 2016 Andrea Martinelli + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + + +B. ConstVisualizer +MIT License +https://github.com/mrlacey/ConstVisualizer/blob/main/LICENSE +------------------------------- +MIT License + +Copyright (c) 2020 Matt Lacey + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + + +C. InlineColorPicker +MIT License +https://github.com/nokola/InlineColorPicker/blob/main/LICENSE +------------------------------- +MIT License + +Copyright (c) 2021 Nokola + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + + +D. Tiny Json +MIT License +https://github.com/zanders3/json/blob/master/LICENSE +------------------------------- +The MIT License (MIT) + +Copyright (c) 2018 Alex Parker + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + + +E. Roslyn +MIT License +https://github.com/dotnet/roslyn/blob/main/License.txt +------------------------------- +The MIT License (MIT) + +Copyright (c) .NET Foundation and Contributors + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + +F. YamlDotNet +MIT License +https://github.com/aaubry/YamlDotNet/blob/master/LICENSE.txt +------------------------------- +Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Antoine Aubry and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + + +G. Command Line Parser +MIT License +https://github.com/commandlineparser/commandline/blob/master/License.md +------------------------------- +The MIT License (MIT) + +Copyright (c) 2005 - 2015 Giacomo Stelluti Scala & Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + + + +H. Dotnet SDK for OpenAI ChatGPT, Whisper, GPT-4 and DALL·E +MIT License +https://github.com/betalgo/openai/blob/master/LICENSE +------------------------------- +MIT License + +Copyright (c) 2022 Betalgo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + + +I. Newtonsoft.Json +MIT License +https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md +------------------------------- +The MIT License (MIT) + +Copyright (c) 2007 James Newton-King + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + + +J. UnityCommandLineTools +https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md +------------------------------- +MIT License + +Copyright (c) 2020 Katsumasa + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + + +K. NetMQ +LGPLv3 +https://github.com/zeromq/netmq/blob/master/COPYING.LESSER +------------------------------- + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + +-------------------------------------------------------------------------------- + + SPECIAL EXCEPTION GRANTED BY COPYRIGHT HOLDERS + +As a special exception, copyright holders give you permission to link this +library with independent modules to produce an executable, regardless of +the license terms of these independent modules, and to copy and distribute +the resulting executable under terms of your choice, provided that you also +meet, for each linked independent module, the terms and conditions of +the license of that module. An independent module is a module which is not +derived from or based on this library. If you modify this library, you must +extend this exception to your version of the library. + + + + +K. PlayerPrefs Editor for Unity 3D +GPL-3.0 license +https://github.com/Dysman/bgTools-playerPrefsEditor/blob/master/LICENSE.md +------------------------------- + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + + + + +M. Serilog +Apache-2.0 +https://github.com/serilog/serilog/blob/dev/LICENSE + +N. Serilog.Sinks.PersistentFile +Apache-2.0 +https://github.com/dfacto-lab/serilog-sinks-file/blob/dev/LICENSE + +O. Serilog.Settings.Reloader +Apache-2.0 +https://github.com/tagcode/serilog-settings-reloader/blob/master/LICENSE + +P. Community.VisualStudio.Toolkit.17 +Apache-2.0 +https://github.com/VsixCommunity/Community.VisualStudio.Toolkit/blob/master/LICENSE + +Q. Diffplex +Apache-2.0 +https://github.com/mmanela/diffplex/blob/master/License.txt + +------------------------------- + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + + + +R. EditorCoroutines +Unity Companion License +https://unity.com/legal/licenses/unity-companion-license + +------------------------------- +Unity Companion License ("License") +v1.3 + +Unity Technologies ApS (“Unity”) grants to you a worldwide, non-exclusive, no-charge, and royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, and distribute the work of authorship that accompanies this License (“Work”), subject to the following terms and conditions: + +1. Unity Companion Use. Exercise of the license granted herein is permitted as long as it is in connection with the authoring and/or distribution of applications, software, or other content under a valid Unity content authoring and rendering engine software license (“Engine License”). That means, for example, as long as you authored content using the Work under an Engine License, you may distribute the Work in connection with that content as you see fit under this License. No other exercise of the license granted herein is permitted, and in no event may the Work be used for competitive analysis or to develop a competing product or service. + +2. No Modification of Engine License. Neither this License nor any exercise of the license granted herein modifies the Engine License in any way. + +3. Ownership; Derivative Works. + +3.1 You own your content. In this License, “derivative works” means derivatives of the Work itself--works derived only from the Work by you under this License (for example, modifying the code of the Work itself to improve its efficacy); “derivative works” of the Work do not include, for example, games, apps, or content that you create with the Work. You keep all right, title, and interest in your own content. + +3.2 Unity owns its content. While you keep all right, title, and interest to your own content per the above, as between Unity and you, Unity will own all right, title, and interest to all intellectual property rights (including patent, trademark, and copyright) in the Work and derivative works of the Work, and you hereby assign and agree to assign all such rights in those derivative works to Unity. Should assignment be invalid for any reason, you grant to Unity an irrevocable, perpetual, worldwide, non-exclusive, no-charge, and royalty-free license (with the right to grant sublicenses) under those intellectual property rights to those derivative works. You also agree to waive or refrain from asserting any author’s right, moral rights, or like rights to the extent necessary to permit exploitation as contemplated under this License. + +3.3 Your right to use derivative works. You will always have the right to use derivative works of the Work you create, consonant with this License. + +4. Trademarks. You are not granted any right or license under this License to use any trademarks, service marks, trade names, products names, or branding of Unity or its affiliates (“Trademarks”). Descriptive uses of Trademarks are permitted; see, for example, Unity’s Trademark Guidelines at https://unity.com/legal/branding_trademarks. + +5. Notices & Third-Party Rights. This License, including the copyright notice associated with the Work, must be provided in all substantial portions of the Work and derivative works thereof (or, if that is impracticable, in any other location where such notices are customarily placed). Further, if the Work is accompanied by a Unity “third-party notices” or similar file, you acknowledge and agree that software or content identified in that file is governed by those separate license terms. + +6. DISCLAIMER, LIMITATION OF LIABILITY. THE Work AND ANY DERIVATIVE WORKS THEREOF IS PROVIDED ON AN "AS IS" BASIS, AND IS PROVIDED WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND/OR NON-INFRINGEMENT. IN NO EVENT SHALL ANY COPYRIGHT HOLDER OR AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES (WHETHER DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL, INCLUDING PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF USE, DATA, OR PROFITS, AND BUSINESS INTERRUPTION), OR OTHER LIABILITY WHATSOEVER, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM OR OUT OF, OR IN CONNECTION WITH, THE Work OR ANY DERIVATIVE WORKS THEREOF OR THE USE OF OR OTHER DEALINGS IN SAME, EVEN WHERE ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +7. USE IS ACCEPTANCE and License Versions. Your access to and use of the Work constitutes your acceptance of this License and its terms and conditions. This License may be modified or updated; upon any such modification or update, you will comply with the terms of the updated License for any use of any of the Work under the updated License. + +8. Use in Compliance with Law and Termination. Your exercise of the license granted herein will at all times be in compliance with applicable law and will not infringe any proprietary rights (including intellectual property rights); this License will terminate immediately (i) on any breach by you of this License; and (ii) if you commence any form of patent litigation, including a cross-claim or counterclaim, against anyone wherein you allege that the Work constitutes direct or secondary/indirect patent infringement. + +9. Severability. If any provision of this License is held to be unenforceable or invalid, that provision will be enforced to the maximum extent possible and the other provisions will remain in full force and effect. + +10. Governing Law and Venue. This License is governed by and construed in accordance with the laws of Denmark, except for its conflict of laws rules; the United Nations Convention on Contracts for the International Sale of Goods will not apply. If you reside (or your principal place of business is) within the United States, you and Unity agree to submit to the personal and exclusive jurisdiction of and venue in the state and federal courts located in San Francisco County, California concerning any dispute arising out of this License (“Dispute”). If you reside (or your principal place of business is) outside the United States, you and Unity agree to submit to the personal and exclusive jurisdiction of and venue in the courts located in Copenhagen, Denmark concerning any Dispute. diff --git a/Assets/Plugins/CodeAssist/THIRD-PARTY-NOTICES.TXT.meta b/Assets/Plugins/CodeAssist/THIRD-PARTY-NOTICES.TXT.meta new file mode 100644 index 00000000..3172d559 --- /dev/null +++ b/Assets/Plugins/CodeAssist/THIRD-PARTY-NOTICES.TXT.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: eea240ab066319d47be78ed93c49ad25 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Commands.meta b/Assets/Scripts/Commands.meta new file mode 100644 index 00000000..1d3392cb --- /dev/null +++ b/Assets/Scripts/Commands.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0c5ec2b96cdc7c74aad7d5d4ce44d305 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Commands/AbstractCommands.meta b/Assets/Scripts/Commands/AbstractCommands.meta new file mode 100644 index 00000000..d2eccb2f --- /dev/null +++ b/Assets/Scripts/Commands/AbstractCommands.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 863886b82a0ab444ba3427bfba967c02 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Commands/AbstractCommands/ICommand.cs b/Assets/Scripts/Commands/AbstractCommands/ICommand.cs new file mode 100644 index 00000000..21e23b62 --- /dev/null +++ b/Assets/Scripts/Commands/AbstractCommands/ICommand.cs @@ -0,0 +1,8 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public interface ICommand +{ + public void Execute(); +} diff --git a/Assets/Scripts/Commands/AbstractCommands/ICommand.cs.meta b/Assets/Scripts/Commands/AbstractCommands/ICommand.cs.meta new file mode 100644 index 00000000..5eba8632 --- /dev/null +++ b/Assets/Scripts/Commands/AbstractCommands/ICommand.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c5bc20338a73e1043960d1e4bc230d6e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Commands/AbstractCommands/UnitCommands.cs b/Assets/Scripts/Commands/AbstractCommands/UnitCommands.cs new file mode 100644 index 00000000..86b892f7 --- /dev/null +++ b/Assets/Scripts/Commands/AbstractCommands/UnitCommands.cs @@ -0,0 +1,19 @@ +using Command.Player; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public abstract class UnitCommands : ICommand +{ + public int ActorunitID; + public int TargetunitID; + public int ActorPlayerID; + public int TargetPlayerID; + + protected UnitController actorUnit; + protected UnitController targetUnit; + + public abstract void Execute(); + + public abstract bool WillHitTarget(); +} diff --git a/Assets/Scripts/Commands/AbstractCommands/UnitCommands.cs.meta b/Assets/Scripts/Commands/AbstractCommands/UnitCommands.cs.meta new file mode 100644 index 00000000..1d0ab857 --- /dev/null +++ b/Assets/Scripts/Commands/AbstractCommands/UnitCommands.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6791915577d6fd04d927814cae9c952c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/manifest.json b/Packages/manifest.json index 861a650e..a14a62ca 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -1,15 +1,16 @@ { "dependencies": { - "com.unity.collab-proxy": "2.0.1", - "com.unity.feature.2d": "1.0.0", - "com.unity.ide.rider": "3.0.18", - "com.unity.ide.visualstudio": "2.0.17", + "com.unity.ai.navigation": "1.1.5", + "com.unity.collab-proxy": "2.2.0", + "com.unity.feature.2d": "2.0.0", + "com.unity.ide.rider": "3.0.27", + "com.unity.ide.visualstudio": "2.0.22", "com.unity.ide.vscode": "1.2.5", - "com.unity.test-framework": "1.1.31", + "com.unity.test-framework": "1.1.33", "com.unity.textmeshpro": "3.0.6", - "com.unity.timeline": "1.6.4", + "com.unity.timeline": "1.7.6", "com.unity.ugui": "1.0.0", - "com.unity.visualscripting": "1.8.0", + "com.unity.visualscripting": "1.9.1", "com.unity.modules.ai": "1.0.0", "com.unity.modules.androidjni": "1.0.0", "com.unity.modules.animation": "1.0.0", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index 6aaf454c..1fbc7ece 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -1,34 +1,41 @@ { "dependencies": { "com.unity.2d.animation": { - "version": "7.0.9", + "version": "9.1.0", "depth": 1, "source": "registry", "dependencies": { - "com.unity.2d.common": "6.0.6", + "com.unity.2d.common": "8.0.2", "com.unity.2d.sprite": "1.0.0", + "com.unity.collections": "1.1.0", "com.unity.modules.animation": "1.0.0", "com.unity.modules.uielements": "1.0.0" }, "url": "https://packages.unity.com" }, - "com.unity.2d.common": { - "version": "6.0.6", - "depth": 2, + "com.unity.2d.aseprite": { + "version": "1.1.1", + "depth": 1, "source": "registry", "dependencies": { "com.unity.2d.sprite": "1.0.0", - "com.unity.mathematics": "1.1.0", - "com.unity.modules.uielements": "1.0.0", - "com.unity.burst": "1.5.1" + "com.unity.2d.common": "6.0.6", + "com.unity.mathematics": "1.2.6", + "com.unity.modules.animation": "1.0.0" }, "url": "https://packages.unity.com" }, - "com.unity.2d.path": { - "version": "5.0.2", + "com.unity.2d.common": { + "version": "8.0.2", "depth": 2, "source": "registry", - "dependencies": {}, + "dependencies": { + "com.unity.2d.sprite": "1.0.0", + "com.unity.mathematics": "1.1.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.burst": "1.7.3" + }, "url": "https://packages.unity.com" }, "com.unity.2d.pixel-perfect": { @@ -39,12 +46,12 @@ "url": "https://packages.unity.com" }, "com.unity.2d.psdimporter": { - "version": "6.0.7", + "version": "8.0.4", "depth": 1, "source": "registry", "dependencies": { - "com.unity.2d.animation": "7.0.9", - "com.unity.2d.common": "6.0.6", + "com.unity.2d.animation": "9.1.0", + "com.unity.2d.common": "8.0.2", "com.unity.2d.sprite": "1.0.0" }, "url": "https://packages.unity.com" @@ -56,13 +63,12 @@ "dependencies": {} }, "com.unity.2d.spriteshape": { - "version": "7.0.6", + "version": "9.0.2", "depth": 1, "source": "registry", "dependencies": { "com.unity.mathematics": "1.1.0", - "com.unity.2d.common": "6.0.4", - "com.unity.2d.path": "5.0.2", + "com.unity.2d.common": "8.0.1", "com.unity.modules.physics2d": "1.0.0" }, "url": "https://packages.unity.com" @@ -71,10 +77,13 @@ "version": "1.0.0", "depth": 1, "source": "builtin", - "dependencies": {} + "dependencies": { + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.uielements": "1.0.0" + } }, "com.unity.2d.tilemap.extras": { - "version": "2.2.4", + "version": "3.1.2", "depth": 1, "source": "registry", "dependencies": { @@ -85,22 +94,42 @@ }, "url": "https://packages.unity.com" }, + "com.unity.ai.navigation": { + "version": "1.1.5", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.modules.ai": "1.0.0" + }, + "url": "https://packages.unity.com" + }, "com.unity.burst": { - "version": "1.6.6", + "version": "1.8.12", "depth": 3, "source": "registry", "dependencies": { - "com.unity.mathematics": "1.2.1" + "com.unity.mathematics": "1.2.1", + "com.unity.modules.jsonserialize": "1.0.0" }, "url": "https://packages.unity.com" }, "com.unity.collab-proxy": { - "version": "2.0.1", + "version": "2.2.0", "depth": 0, "source": "registry", "dependencies": {}, "url": "https://packages.unity.com" }, + "com.unity.collections": { + "version": "1.2.4", + "depth": 2, + "source": "registry", + "dependencies": { + "com.unity.burst": "1.6.6", + "com.unity.test-framework": "1.1.31" + }, + "url": "https://packages.unity.com" + }, "com.unity.ext.nunit": { "version": "1.0.6", "depth": 1, @@ -109,21 +138,22 @@ "url": "https://packages.unity.com" }, "com.unity.feature.2d": { - "version": "1.0.0", + "version": "2.0.0", "depth": 0, "source": "builtin", "dependencies": { - "com.unity.2d.animation": "7.0.9", + "com.unity.2d.animation": "9.1.0", "com.unity.2d.pixel-perfect": "5.0.3", - "com.unity.2d.psdimporter": "6.0.7", + "com.unity.2d.psdimporter": "8.0.4", "com.unity.2d.sprite": "1.0.0", - "com.unity.2d.spriteshape": "7.0.6", + "com.unity.2d.spriteshape": "9.0.2", "com.unity.2d.tilemap": "1.0.0", - "com.unity.2d.tilemap.extras": "2.2.4" + "com.unity.2d.tilemap.extras": "3.1.2", + "com.unity.2d.aseprite": "1.1.1" } }, "com.unity.ide.rider": { - "version": "3.0.18", + "version": "3.0.27", "depth": 0, "source": "registry", "dependencies": { @@ -132,7 +162,7 @@ "url": "https://packages.unity.com" }, "com.unity.ide.visualstudio": { - "version": "2.0.17", + "version": "2.0.22", "depth": 0, "source": "registry", "dependencies": { @@ -155,7 +185,7 @@ "url": "https://packages.unity.com" }, "com.unity.test-framework": { - "version": "1.1.31", + "version": "1.1.33", "depth": 0, "source": "registry", "dependencies": { @@ -175,7 +205,7 @@ "url": "https://packages.unity.com" }, "com.unity.timeline": { - "version": "1.6.4", + "version": "1.7.6", "depth": 0, "source": "registry", "dependencies": { @@ -196,7 +226,7 @@ } }, "com.unity.visualscripting": { - "version": "1.8.0", + "version": "1.9.1", "depth": 0, "source": "registry", "dependencies": { @@ -337,17 +367,6 @@ "version": "1.0.0", "depth": 0, "source": "builtin", - "dependencies": { - "com.unity.modules.ui": "1.0.0", - "com.unity.modules.imgui": "1.0.0", - "com.unity.modules.jsonserialize": "1.0.0", - "com.unity.modules.uielementsnative": "1.0.0" - } - }, - "com.unity.modules.uielementsnative": { - "version": "1.0.0", - "depth": 1, - "source": "builtin", "dependencies": { "com.unity.modules.ui": "1.0.0", "com.unity.modules.imgui": "1.0.0", diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index ed5cceba..8335e258 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -3,7 +3,7 @@ --- !u!129 &1 PlayerSettings: m_ObjectHideFlags: 0 - serializedVersion: 24 + serializedVersion: 26 productGUID: b05c664001520eb48a5545d911278b51 AndroidProfiler: 0 AndroidFilterTouchesWhenObscured: 0 @@ -48,14 +48,16 @@ PlayerSettings: defaultScreenHeightWeb: 600 m_StereoRenderingPath: 0 m_ActiveColorSpace: 0 + unsupportedMSAAFallback: 0 + m_SpriteBatchVertexThreshold: 300 m_MTRendering: 1 mipStripping: 0 numberOfMipsStripped: 0 + numberOfMipsStrippedPerMipmapLimitGroup: {} m_StackTraceTypes: 010000000100000001000000010000000100000001000000 iosShowActivityIndicatorOnLoading: -1 androidShowActivityIndicatorOnLoading: -1 iosUseCustomAppBackgroundBehavior: 0 - iosAllowHTTPDownload: 1 allowedAutorotateToPortrait: 1 allowedAutorotateToPortraitUpsideDown: 1 allowedAutorotateToLandscapeRight: 1 @@ -74,6 +76,7 @@ PlayerSettings: androidMinimumWindowWidth: 400 androidMinimumWindowHeight: 300 androidFullscreenMode: 1 + androidAutoRotationBehavior: 1 defaultIsNativeResolution: 1 macRetinaSupport: 1 runInBackground: 0 @@ -85,6 +88,7 @@ PlayerSettings: hideHomeButton: 0 submitAnalytics: 1 usePlayerLog: 1 + dedicatedServerOptimizations: 0 bakeCollisionMeshes: 0 forceSingleInstance: 0 useFlipModelSwapchain: 1 @@ -119,8 +123,12 @@ PlayerSettings: switchNVNShaderPoolsGranularity: 33554432 switchNVNDefaultPoolsGranularity: 16777216 switchNVNOtherPoolsGranularity: 16777216 + switchGpuScratchPoolGranularity: 2097152 + switchAllowGpuScratchShrinking: 0 switchNVNMaxPublicTextureIDCount: 0 switchNVNMaxPublicSamplerIDCount: 0 + switchNVNGraphicsFirmwareMemory: 32 + switchMaxWorkerMultiple: 8 stadiaPresentMode: 0 stadiaTargetFramerate: 0 vulkanNumSwapchainBuffers: 3 @@ -128,12 +136,9 @@ PlayerSettings: vulkanEnablePreTransform: 0 vulkanEnableLateAcquireNextImage: 0 vulkanEnableCommandBufferRecycling: 1 - m_SupportedAspectRatios: - 4:3: 1 - 5:4: 1 - 16:10: 1 - 16:9: 1 - Others: 1 + loadStoreDebugModeEnabled: 0 + visionOSBundleVersion: 1.0 + tvOSBundleVersion: 1.0 bundleVersion: 1.0 preloadedAssets: [] metroInputSource: 0 @@ -146,8 +151,9 @@ PlayerSettings: isWsaHolographicRemotingEnabled: 0 enableFrameTimingStats: 0 enableOpenGLProfilerGPURecorders: 1 + allowHDRDisplaySupport: 0 useHDRDisplay: 0 - D3DHDRBitDepth: 0 + hdrBitDepth: 0 m_ColorGamuts: 00000000 targetPixelDensity: 30 resolutionScalingMode: 0 @@ -158,6 +164,7 @@ PlayerSettings: Standalone: com.DefaultCompany.2DProject buildNumber: Standalone: 0 + VisionOS: 0 iPhone: 0 tvOS: 0 overrideDefaultApplicationIdentifier: 1 @@ -175,12 +182,15 @@ PlayerSettings: APKExpansionFiles: 0 keepLoadedShadersAlive: 0 StripUnusedMeshComponents: 0 + strictShaderVariantMatching: 0 VertexChannelCompressionMask: 4054 iPhoneSdkVersion: 988 - iOSTargetOSVersionString: 11.0 + iOSTargetOSVersionString: 12.0 tvOSSdkVersion: 0 tvOSRequireExtendedGameController: 0 - tvOSTargetOSVersionString: 11.0 + tvOSTargetOSVersionString: 12.0 + VisionOSSdkVersion: 0 + VisionOSTargetOSVersionString: 1.0 uIPrerenderedIcon: 0 uIRequiresPersistentWiFi: 0 uIRequiresFullScreen: 1 @@ -228,8 +238,10 @@ PlayerSettings: appleDeveloperTeamID: iOSManualSigningProvisioningProfileID: tvOSManualSigningProvisioningProfileID: + VisionOSManualSigningProvisioningProfileID: iOSManualSigningProvisioningProfileType: 0 tvOSManualSigningProvisioningProfileType: 0 + VisionOSManualSigningProvisioningProfileType: 0 appleEnableAutomaticSigning: 0 iOSRequireARKit: 0 iOSAutomaticallyDetectAndAddCapabilities: 1 @@ -244,6 +256,7 @@ PlayerSettings: useCustomLauncherGradleManifest: 0 useCustomBaseGradleTemplate: 0 useCustomGradlePropertiesTemplate: 0 + useCustomGradleSettingsTemplate: 0 useCustomProguardFile: 0 AndroidTargetArchitectures: 1 AndroidTargetDevices: 0 @@ -251,6 +264,7 @@ PlayerSettings: androidSplashScreen: {fileID: 0} AndroidKeystoreName: AndroidKeyaliasName: + AndroidEnableArmv9SecurityFeatures: 0 AndroidBuildApkPerCpuArchitecture: 0 AndroidTVCompatibility: 0 AndroidIsGame: 1 @@ -264,7 +278,6 @@ PlayerSettings: banner: {fileID: 0} androidGamepadSupportLevel: 0 chromeosInputEmulation: 1 - AndroidMinifyWithR8: 0 AndroidMinifyRelease: 0 AndroidMinifyDebug: 0 AndroidValidateAppBundleSize: 1 @@ -363,6 +376,103 @@ PlayerSettings: m_Height: 36 m_Kind: 0 m_SubKind: + - m_BuildTarget: iPhone + m_Icons: + - m_Textures: [] + m_Width: 180 + m_Height: 180 + m_Kind: 0 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 120 + m_Height: 120 + m_Kind: 0 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 167 + m_Height: 167 + m_Kind: 0 + m_SubKind: iPad + - m_Textures: [] + m_Width: 152 + m_Height: 152 + m_Kind: 0 + m_SubKind: iPad + - m_Textures: [] + m_Width: 76 + m_Height: 76 + m_Kind: 0 + m_SubKind: iPad + - m_Textures: [] + m_Width: 120 + m_Height: 120 + m_Kind: 3 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 80 + m_Height: 80 + m_Kind: 3 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 80 + m_Height: 80 + m_Kind: 3 + m_SubKind: iPad + - m_Textures: [] + m_Width: 40 + m_Height: 40 + m_Kind: 3 + m_SubKind: iPad + - m_Textures: [] + m_Width: 87 + m_Height: 87 + m_Kind: 1 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 58 + m_Height: 58 + m_Kind: 1 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 29 + m_Height: 29 + m_Kind: 1 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 58 + m_Height: 58 + m_Kind: 1 + m_SubKind: iPad + - m_Textures: [] + m_Width: 29 + m_Height: 29 + m_Kind: 1 + m_SubKind: iPad + - m_Textures: [] + m_Width: 60 + m_Height: 60 + m_Kind: 2 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 40 + m_Height: 40 + m_Kind: 2 + m_SubKind: iPhone + - m_Textures: [] + m_Width: 40 + m_Height: 40 + m_Kind: 2 + m_SubKind: iPad + - m_Textures: [] + m_Width: 20 + m_Height: 20 + m_Kind: 2 + m_SubKind: iPad + - m_Textures: [] + m_Width: 1024 + m_Height: 1024 + m_Kind: 4 + m_SubKind: App Store m_BuildTargetBatching: [] m_BuildTargetShaderSettings: [] m_BuildTargetGraphicsJobs: @@ -412,7 +522,9 @@ PlayerSettings: iPhone: 1 tvOS: 1 m_BuildTargetGroupLightmapEncodingQuality: [] + m_BuildTargetGroupHDRCubemapEncodingQuality: [] m_BuildTargetGroupLightmapSettings: [] + m_BuildTargetGroupLoadStoreDebugModeSettings: [] m_BuildTargetNormalMapEncoding: [] m_BuildTargetDefaultTextureCompressionFormat: - m_BuildTarget: Android @@ -427,6 +539,7 @@ PlayerSettings: locationUsageDescription: microphoneUsageDescription: bluetoothUsageDescription: + macOSTargetOSVersion: 10.13.0 switchNMETAOverride: switchNetLibKey: switchSocketMemoryPoolSize: 6144 @@ -434,10 +547,11 @@ PlayerSettings: switchSocketConcurrencyLimit: 14 switchScreenResolutionBehavior: 2 switchUseCPUProfiler: 0 - switchUseGOLDLinker: 0 + switchEnableFileSystemTrace: 0 switchLTOSetting: 0 switchApplicationID: 0x01004b9000490000 switchNSODependencies: + switchCompilerFlags: switchTitleNames_0: switchTitleNames_1: switchTitleNames_2: @@ -563,7 +677,6 @@ PlayerSettings: switchSocketBufferEfficiency: 4 switchSocketInitializeEnabled: 1 switchNetworkInterfaceManagerInitializeEnabled: 1 - switchPlayerConnectionEnabled: 1 switchUseNewStyleFilepaths: 0 switchUseLegacyFmodPriorities: 1 switchUseMicroSleepForYield: 1 @@ -653,6 +766,7 @@ PlayerSettings: webGLMemorySize: 32 webGLExceptionSupport: 1 webGLNameFilesAsHashes: 0 + webGLShowDiagnostics: 0 webGLDataCaching: 1 webGLDebugSymbols: 0 webGLEmscriptenArgs: @@ -665,12 +779,19 @@ PlayerSettings: webGLLinkerTarget: 1 webGLThreadsSupport: 0 webGLDecompressionFallback: 0 + webGLInitialMemorySize: 32 + webGLMaximumMemorySize: 2048 + webGLMemoryGrowthMode: 2 + webGLMemoryLinearGrowthStep: 16 + webGLMemoryGeometricGrowthStep: 0.2 + webGLMemoryGeometricGrowthCap: 96 webGLPowerPreference: 2 scriptingDefineSymbols: {} additionalCompilerArguments: {} platformArchitecture: {} scriptingBackend: {} il2cppCompilerConfiguration: {} + il2cppCodeGeneration: {} managedStrippingLevel: EmbeddedLinux: 1 GameCoreScarlett: 1 @@ -689,12 +810,9 @@ PlayerSettings: suppressCommonWarnings: 1 allowUnsafeCode: 0 useDeterministicCompilation: 1 - enableRoslynAnalyzers: 1 - selectedPlatform: 0 additionalIl2CppArgs: scriptingRuntimeVersion: 1 gcIncremental: 1 - assemblyVersionValidation: 1 gcWBarrierValidation: 0 apiCompatibilityLevelPerPlatform: {} m_RenderingPath: 1 @@ -766,6 +884,11 @@ PlayerSettings: luminVersion: m_VersionCode: 1 m_VersionName: + hmiPlayerDataPath: + hmiForceSRGBBlit: 1 + embeddedLinuxEnableGamepadInput: 1 + hmiLogStartupTiming: 0 + hmiCpuConfiguration: apiCompatibilityLevel: 6 activeInputHandler: 0 windowsGamepadBackendHint: 0 @@ -776,6 +899,7 @@ PlayerSettings: organizationId: cloudEnabled: 0 legacyClampBlendShapeWeights: 0 - playerDataPath: - forceSRGBBlit: 1 + hmiLoadingImage: {fileID: 0} + platformRequiresReadableAssets: 0 virtualTexturingSupportEnabled: 0 + insecureHttpOption: 0 diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt index bca3d022..224decfe 100644 --- a/ProjectSettings/ProjectVersion.txt +++ b/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2021.3.21f1 -m_EditorVersionWithRevision: 2021.3.21f1 (1b156197d683) +m_EditorVersion: 2022.3.20f1 +m_EditorVersionWithRevision: 2022.3.20f1 (61c2feb0970d) diff --git a/ProjectSettings/boot.config b/ProjectSettings/boot.config deleted file mode 100644 index e69de29b..00000000 From c2ad51ff6d7101d58a813523870bf7519532d93d Mon Sep 17 00:00:00 2001 From: Yashvardhan4197 <20BCS4197@cuchd.in> Date: Mon, 26 Aug 2024 22:49:27 +0530 Subject: [PATCH 02/18] Added Command Invoker --- Assets/Scripts/Commands/CommandInvoker.cs | 22 +++++++++++++++++++ .../Scripts/Commands/CommandInvoker.cs.meta | 11 ++++++++++ 2 files changed, 33 insertions(+) create mode 100644 Assets/Scripts/Commands/CommandInvoker.cs create mode 100644 Assets/Scripts/Commands/CommandInvoker.cs.meta diff --git a/Assets/Scripts/Commands/CommandInvoker.cs b/Assets/Scripts/Commands/CommandInvoker.cs new file mode 100644 index 00000000..40cef839 --- /dev/null +++ b/Assets/Scripts/Commands/CommandInvoker.cs @@ -0,0 +1,22 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class CommandInvoker +{ + private Stack _command; + public CommandInvoker() + { + _command = new Stack(); + } + + public void ProcessCommand(ICommand command) + { + ExecuteCommand(command); + RegisterCommand(command); + } + + private void ExecuteCommand(ICommand command)=>command.Execute(); + private void RegisterCommand(ICommand command)=>_command.Push(command); + +} diff --git a/Assets/Scripts/Commands/CommandInvoker.cs.meta b/Assets/Scripts/Commands/CommandInvoker.cs.meta new file mode 100644 index 00000000..cbb40ba7 --- /dev/null +++ b/Assets/Scripts/Commands/CommandInvoker.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 50cc03d0885d4ca4d994473579439186 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From d49c857ce2a59c91a8efd0918bb107f1fc2aa7c7 Mon Sep 17 00:00:00 2001 From: Yashvardhan4197 <20BCS4197@cuchd.in> Date: Tue, 27 Aug 2024 13:51:47 +0530 Subject: [PATCH 03/18] added concrete commands to perform actions --- Assets/Scripts/Action/ActionService.cs | 22 +++++++------- Assets/Scripts/Action/Actions/AttackAction.cs | 9 +++--- .../Action/Actions/AttackStanceAction.cs | 10 +++---- .../Action/Actions/BerserkAttackAction.cs | 10 +++---- .../Scripts/Action/Actions/CleanseAction.cs | 11 +++---- Assets/Scripts/Action/Actions/HealAction.cs | 10 +++---- .../Scripts/Action/Actions/MeditateAction.cs | 12 ++++---- .../Scripts/Action/Actions/ThirdEyeAction.cs | 11 ++++--- .../Action/{ActionType.cs => CommandType.cs} | 2 +- ...ActionType.cs.meta => CommandType.cs.meta} | 2 +- Assets/Scripts/Action/IAction.cs | 4 +-- .../Commands/AbstractCommands/UnitCommands.cs | 6 ++-- Assets/Scripts/Commands/CommandData.cs | 21 ++++++++++++++ Assets/Scripts/Commands/CommandData.cs.meta | 11 +++++++ Assets/Scripts/Commands/ConcreteCommands.meta | 8 +++++ .../Commands/ConcreteCommands/Attack.cs | 29 +++++++++++++++++++ .../Commands/ConcreteCommands/Attack.cs.meta | 11 +++++++ .../Commands/ConcreteCommands/AttackStance.cs | 28 ++++++++++++++++++ .../ConcreteCommands/AttackStance.cs.meta | 11 +++++++ .../ConcreteCommands/BerserkAttack.cs | 24 +++++++++++++++ .../ConcreteCommands/BerserkAttack.cs.meta | 11 +++++++ .../Commands/ConcreteCommands/Cleanse.cs | 22 ++++++++++++++ .../Commands/ConcreteCommands/Cleanse.cs.meta | 11 +++++++ .../Scripts/Commands/ConcreteCommands/Heal.cs | 28 ++++++++++++++++++ .../Commands/ConcreteCommands/Heal.cs.meta | 11 +++++++ .../Commands/ConcreteCommands/Meditate.cs | 28 ++++++++++++++++++ .../ConcreteCommands/Meditate.cs.meta | 11 +++++++ .../Commands/ConcreteCommands/ThirdEye.cs | 27 +++++++++++++++++ .../ConcreteCommands/ThirdEye.cs.meta | 11 +++++++ Assets/Scripts/Events/EventService.cs | 4 +-- Assets/Scripts/Input/InputService.cs | 6 ++-- Assets/Scripts/Player/PlayerService.cs | 2 +- Assets/Scripts/Player/Unit/UnitController.cs | 10 +++---- .../Player/Unit/UnitScriptableObject.cs | 2 +- .../UI/ActionSelectionUI/ActionButtonView.cs | 4 +-- .../ActionSelectionUIController.cs | 8 ++--- Assets/Scripts/UI/UIService.cs | 2 +- 37 files changed, 375 insertions(+), 75 deletions(-) rename Assets/Scripts/Action/{ActionType.cs => CommandType.cs} (86%) rename Assets/Scripts/Action/{ActionType.cs.meta => CommandType.cs.meta} (83%) create mode 100644 Assets/Scripts/Commands/CommandData.cs create mode 100644 Assets/Scripts/Commands/CommandData.cs.meta create mode 100644 Assets/Scripts/Commands/ConcreteCommands.meta create mode 100644 Assets/Scripts/Commands/ConcreteCommands/Attack.cs create mode 100644 Assets/Scripts/Commands/ConcreteCommands/Attack.cs.meta create mode 100644 Assets/Scripts/Commands/ConcreteCommands/AttackStance.cs create mode 100644 Assets/Scripts/Commands/ConcreteCommands/AttackStance.cs.meta create mode 100644 Assets/Scripts/Commands/ConcreteCommands/BerserkAttack.cs create mode 100644 Assets/Scripts/Commands/ConcreteCommands/BerserkAttack.cs.meta create mode 100644 Assets/Scripts/Commands/ConcreteCommands/Cleanse.cs create mode 100644 Assets/Scripts/Commands/ConcreteCommands/Cleanse.cs.meta create mode 100644 Assets/Scripts/Commands/ConcreteCommands/Heal.cs create mode 100644 Assets/Scripts/Commands/ConcreteCommands/Heal.cs.meta create mode 100644 Assets/Scripts/Commands/ConcreteCommands/Meditate.cs create mode 100644 Assets/Scripts/Commands/ConcreteCommands/Meditate.cs.meta create mode 100644 Assets/Scripts/Commands/ConcreteCommands/ThirdEye.cs create mode 100644 Assets/Scripts/Commands/ConcreteCommands/ThirdEye.cs.meta diff --git a/Assets/Scripts/Action/ActionService.cs b/Assets/Scripts/Action/ActionService.cs index 957c65c0..3e5c2f04 100644 --- a/Assets/Scripts/Action/ActionService.cs +++ b/Assets/Scripts/Action/ActionService.cs @@ -5,23 +5,23 @@ namespace Command.Actions { public class ActionService { - private Dictionary actions; + private Dictionary actions; public ActionService() => CreateActions(); private void CreateActions() { - actions = new Dictionary(); - actions.Add(ActionType.Attack, new AttackAction()); - actions.Add(ActionType.Heal, new HealAction()); - actions.Add(ActionType.AttackStance, new AttackStanceAction()); - actions.Add(ActionType.Cleanse, new CleanseAction()); - actions.Add(ActionType.Meditate, new MeditateAction()); - actions.Add(ActionType.BerserkAttack, new BerserkAttackAction()); - actions.Add(ActionType.ThirdEye, new ThirdEyeAction()); + actions = new Dictionary(); + actions.Add(CommandType.Attack, new AttackAction()); + actions.Add(CommandType.Heal, new HealAction()); + actions.Add(CommandType.AttackStance, new AttackStanceAction()); + actions.Add(CommandType.Cleanse, new CleanseAction()); + actions.Add(CommandType.Meditate, new MeditateAction()); + actions.Add(CommandType.BerserkAttack, new BerserkAttackAction()); + actions.Add(CommandType.ThirdEye, new ThirdEyeAction()); } - public IAction GetActionByType(ActionType type) + public IAction GetActionByType(CommandType type) { if (actions.ContainsKey(type)) return actions[type]; @@ -29,6 +29,6 @@ public IAction GetActionByType(ActionType type) throw new System.Exception($"No Action found for the type {type} in the dictionary"); } - public TargetType GetTargetTypeForAction(ActionType actionType) => actions[actionType].TargetType; + public TargetType GetTargetTypeForAction(CommandType actionType) => actions[actionType].TargetType; } } \ No newline at end of file diff --git a/Assets/Scripts/Action/Actions/AttackAction.cs b/Assets/Scripts/Action/Actions/AttackAction.cs index 75632f04..0561c8f0 100644 --- a/Assets/Scripts/Action/Actions/AttackAction.cs +++ b/Assets/Scripts/Action/Actions/AttackAction.cs @@ -9,21 +9,22 @@ public class AttackAction : IAction { private UnitController actorUnit; private UnitController targetUnit; + private bool isSuccessful; public TargetType TargetType => TargetType.Enemy; - public void PerformAction(UnitController actorUnit, UnitController targetUnit) + public void PerformAction(UnitController actorUnit, UnitController targetUnit, bool isSuccessful) { this.actorUnit = actorUnit; this.targetUnit = targetUnit; - - actorUnit.PlayBattleAnimation(ActionType.Attack, CalculateMovePosition(targetUnit), OnActionAnimationCompleted); + this.isSuccessful = isSuccessful; + actorUnit.PlayBattleAnimation(CommandType.Attack, CalculateMovePosition(targetUnit), OnActionAnimationCompleted); } public void OnActionAnimationCompleted() { PlayAttackSound(); - if (IsSuccessful()) + if (isSuccessful) targetUnit.TakeDamage(actorUnit.CurrentPower); else GameService.Instance.UIService.ActionMissed(); diff --git a/Assets/Scripts/Action/Actions/AttackStanceAction.cs b/Assets/Scripts/Action/Actions/AttackStanceAction.cs index 9fc46d34..fe566cf0 100644 --- a/Assets/Scripts/Action/Actions/AttackStanceAction.cs +++ b/Assets/Scripts/Action/Actions/AttackStanceAction.cs @@ -9,28 +9,28 @@ public class AttackStanceAction : IAction { private UnitController actorUnit; private UnitController targetUnit; + private bool isSuccessful; TargetType IAction.TargetType { get => TargetType.Self; } - public void PerformAction(UnitController actorUnit, UnitController targetUnit) + public void PerformAction(UnitController actorUnit, UnitController targetUnit, bool isSuccessful) { this.actorUnit = actorUnit; this.targetUnit = targetUnit; + this.isSuccessful = isSuccessful; - actorUnit.PlayBattleAnimation(ActionType.AttackStance, CalculateMovePosition(targetUnit), OnActionAnimationCompleted); + actorUnit.PlayBattleAnimation(CommandType.AttackStance, CalculateMovePosition(targetUnit), OnActionAnimationCompleted); } public void OnActionAnimationCompleted() { GameService.Instance.SoundService.PlaySoundEffects(Sound.SoundType.ATTACK_STANCE); - if (IsSuccessful()) + if (isSuccessful) targetUnit.CurrentPower += (int)(targetUnit.CurrentPower * 0.2f); else GameService.Instance.UIService.ActionMissed(); } - public bool IsSuccessful() => true; - public Vector3 CalculateMovePosition(UnitController targetUnit) => targetUnit.GetEnemyPosition(); } } \ No newline at end of file diff --git a/Assets/Scripts/Action/Actions/BerserkAttackAction.cs b/Assets/Scripts/Action/Actions/BerserkAttackAction.cs index 42ce5acd..c4db2b4c 100644 --- a/Assets/Scripts/Action/Actions/BerserkAttackAction.cs +++ b/Assets/Scripts/Action/Actions/BerserkAttackAction.cs @@ -10,21 +10,23 @@ public class BerserkAttackAction : IAction private const float hitChance = 0.66f; private UnitController actorUnit; private UnitController targetUnit; + private bool isSuccessful; public TargetType TargetType => TargetType.Enemy; - public void PerformAction(UnitController actorUnit, UnitController targetUnit) + public void PerformAction(UnitController actorUnit, UnitController targetUnit, bool isSuccessful) { this.actorUnit = actorUnit; this.targetUnit = targetUnit; + this.isSuccessful=isSuccessful; - actorUnit.PlayBattleAnimation(ActionType.BerserkAttack, CalculateMovePosition(targetUnit), OnActionAnimationCompleted); + actorUnit.PlayBattleAnimation(CommandType.BerserkAttack, CalculateMovePosition(targetUnit), OnActionAnimationCompleted); } public void OnActionAnimationCompleted() { GameService.Instance.SoundService.PlaySoundEffects(Sound.SoundType.BERSERK_ATTACK); - if (IsSuccessful()) + if (isSuccessful) targetUnit.TakeDamage(actorUnit.CurrentPower * 2); else { @@ -33,8 +35,6 @@ public void OnActionAnimationCompleted() } } - public bool IsSuccessful() => Random.Range(0f, 1f) < hitChance; - public Vector3 CalculateMovePosition(UnitController targetUnit) => targetUnit.GetEnemyPosition(); } } \ No newline at end of file diff --git a/Assets/Scripts/Action/Actions/CleanseAction.cs b/Assets/Scripts/Action/Actions/CleanseAction.cs index 469071ea..29fed903 100644 --- a/Assets/Scripts/Action/Actions/CleanseAction.cs +++ b/Assets/Scripts/Action/Actions/CleanseAction.cs @@ -10,28 +10,29 @@ public class CleanseAction : IAction private const float hitChance = 0.2f; private UnitController actorUnit; private UnitController targetUnit; + private bool isSuccessful; + public TargetType TargetType => TargetType.Enemy; - public void PerformAction(UnitController actorUnit, UnitController targetUnit) + public void PerformAction(UnitController actorUnit, UnitController targetUnit,bool isSuccessful) { this.actorUnit = actorUnit; this.targetUnit = targetUnit; + this.isSuccessful = isSuccessful; - actorUnit.PlayBattleAnimation(ActionType.Cleanse, CalculateMovePosition(targetUnit), OnActionAnimationCompleted); + actorUnit.PlayBattleAnimation(CommandType.Cleanse, CalculateMovePosition(targetUnit), OnActionAnimationCompleted); } public void OnActionAnimationCompleted() { GameService.Instance.SoundService.PlaySoundEffects(Sound.SoundType.CLEANSE); - if (IsSuccessful()) + if (isSuccessful) targetUnit.ResetStats(); else GameService.Instance.UIService.ActionMissed(); } - public bool IsSuccessful() => Random.Range(0f, 1f) < hitChance; - public Vector3 CalculateMovePosition(UnitController targetUnit) => targetUnit.GetEnemyPosition(); } } diff --git a/Assets/Scripts/Action/Actions/HealAction.cs b/Assets/Scripts/Action/Actions/HealAction.cs index d05b6d47..73f9718b 100644 --- a/Assets/Scripts/Action/Actions/HealAction.cs +++ b/Assets/Scripts/Action/Actions/HealAction.cs @@ -9,26 +9,26 @@ public class HealAction : IAction { private UnitController actorUnit; private UnitController targetUnit; + private bool isSuccessful; public TargetType TargetType => TargetType.Friendly; - public void PerformAction(UnitController actorUnit, UnitController targetUnit) + public void PerformAction(UnitController actorUnit, UnitController targetUnit, bool isSuccessful) { this.actorUnit = actorUnit; this.targetUnit = targetUnit; + this.isSuccessful = isSuccessful; - actorUnit.PlayBattleAnimation(ActionType.Heal, CalculateMovePosition(targetUnit), OnActionAnimationCompleted); + actorUnit.PlayBattleAnimation(CommandType.Heal, CalculateMovePosition(targetUnit), OnActionAnimationCompleted); } public void OnActionAnimationCompleted() { GameService.Instance.SoundService.PlaySoundEffects(Sound.SoundType.HEAL); - if (IsSuccessful()) + if (isSuccessful) targetUnit.RestoreHealth(actorUnit.CurrentPower); } - public bool IsSuccessful() => true; - public Vector3 CalculateMovePosition(UnitController targetUnit) => targetUnit.GetEnemyPosition(); } } \ No newline at end of file diff --git a/Assets/Scripts/Action/Actions/MeditateAction.cs b/Assets/Scripts/Action/Actions/MeditateAction.cs index 869e159b..e27c5a18 100644 --- a/Assets/Scripts/Action/Actions/MeditateAction.cs +++ b/Assets/Scripts/Action/Actions/MeditateAction.cs @@ -9,21 +9,23 @@ public class MeditateAction : IAction { private UnitController actorUnit; private UnitController targetUnit; + private bool isSuccessful; + public TargetType TargetType => TargetType.Self; - public void PerformAction(UnitController actorUnit, UnitController targetUnit) + public void PerformAction(UnitController actorUnit, UnitController targetUnit, bool isSuccessful) { this.actorUnit = actorUnit; this.targetUnit = targetUnit; - - actorUnit.PlayBattleAnimation(ActionType.Meditate, CalculateMovePosition(targetUnit), OnActionAnimationCompleted); + this.isSuccessful = isSuccessful; + actorUnit.PlayBattleAnimation(CommandType.Meditate, CalculateMovePosition(targetUnit), OnActionAnimationCompleted); } public void OnActionAnimationCompleted() { GameService.Instance.SoundService.PlaySoundEffects(Sound.SoundType.MEDITATE); - if (IsSuccessful()) + if (isSuccessful) { var healthToIncrease = (int)(targetUnit.CurrentMaxHealth * 0.2f); targetUnit.CurrentMaxHealth += healthToIncrease; @@ -33,8 +35,6 @@ public void OnActionAnimationCompleted() GameService.Instance.UIService.ActionMissed(); } - public bool IsSuccessful() => true; - public Vector3 CalculateMovePosition(UnitController targetUnit) => targetUnit.GetEnemyPosition(); } } \ No newline at end of file diff --git a/Assets/Scripts/Action/Actions/ThirdEyeAction.cs b/Assets/Scripts/Action/Actions/ThirdEyeAction.cs index 8a24ba01..bdd6e27f 100644 --- a/Assets/Scripts/Action/Actions/ThirdEyeAction.cs +++ b/Assets/Scripts/Action/Actions/ThirdEyeAction.cs @@ -9,19 +9,20 @@ public class ThirdEyeAction : IAction { private UnitController actorUnit; private UnitController targetUnit; + private bool isSuccessful; public TargetType TargetType => TargetType.Self; - public void PerformAction(UnitController actorUnit, UnitController targetUnit) + public void PerformAction(UnitController actorUnit, UnitController targetUnit, bool isSuccessful) { this.actorUnit = actorUnit; this.targetUnit = targetUnit; - - actorUnit.PlayBattleAnimation(ActionType.BerserkAttack, CalculateMovePosition(targetUnit), OnActionAnimationCompleted); + this.isSuccessful = isSuccessful; + actorUnit.PlayBattleAnimation(CommandType.BerserkAttack, CalculateMovePosition(targetUnit), OnActionAnimationCompleted); } public void OnActionAnimationCompleted() { - if (IsSuccessful()) + if (isSuccessful) { int healthToConvert = (int)(targetUnit.CurrentHealth * 0.25f); targetUnit.TakeDamage(healthToConvert); @@ -31,8 +32,6 @@ public void OnActionAnimationCompleted() GameService.Instance.UIService.ActionMissed(); } - public bool IsSuccessful() => true; - public Vector3 CalculateMovePosition(UnitController targetUnit) => targetUnit.GetEnemyPosition(); } } \ No newline at end of file diff --git a/Assets/Scripts/Action/ActionType.cs b/Assets/Scripts/Action/CommandType.cs similarity index 86% rename from Assets/Scripts/Action/ActionType.cs rename to Assets/Scripts/Action/CommandType.cs index f6c14302..5d65fb64 100644 --- a/Assets/Scripts/Action/ActionType.cs +++ b/Assets/Scripts/Action/CommandType.cs @@ -1,6 +1,6 @@ namespace Command.Actions { - public enum ActionType + public enum CommandType { None, Attack, diff --git a/Assets/Scripts/Action/ActionType.cs.meta b/Assets/Scripts/Action/CommandType.cs.meta similarity index 83% rename from Assets/Scripts/Action/ActionType.cs.meta rename to Assets/Scripts/Action/CommandType.cs.meta index 0c25c443..df5eaadb 100644 --- a/Assets/Scripts/Action/ActionType.cs.meta +++ b/Assets/Scripts/Action/CommandType.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 24ec1f4456a85984898bc624ebcb3f7c +guid: 67003481aa90315478a10967ba738492 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Scripts/Action/IAction.cs b/Assets/Scripts/Action/IAction.cs index 610560d8..ebc12ccf 100644 --- a/Assets/Scripts/Action/IAction.cs +++ b/Assets/Scripts/Action/IAction.cs @@ -11,9 +11,7 @@ public interface IAction { public TargetType TargetType { get; } - public void PerformAction(UnitController actorUnit, UnitController targetUnit); - - public bool IsSuccessful(); + public void PerformAction(UnitController actorUnit, UnitController targetUnit,bool isSuccessful); public Vector3 CalculateMovePosition(UnitController targetUnit); } diff --git a/Assets/Scripts/Commands/AbstractCommands/UnitCommands.cs b/Assets/Scripts/Commands/AbstractCommands/UnitCommands.cs index 86b892f7..1001dc27 100644 --- a/Assets/Scripts/Commands/AbstractCommands/UnitCommands.cs +++ b/Assets/Scripts/Commands/AbstractCommands/UnitCommands.cs @@ -1,3 +1,4 @@ +using Assets.Scripts.Commands; using Command.Player; using System.Collections; using System.Collections.Generic; @@ -5,10 +6,7 @@ public abstract class UnitCommands : ICommand { - public int ActorunitID; - public int TargetunitID; - public int ActorPlayerID; - public int TargetPlayerID; + public CommandData commandData; protected UnitController actorUnit; protected UnitController targetUnit; diff --git a/Assets/Scripts/Commands/CommandData.cs b/Assets/Scripts/Commands/CommandData.cs new file mode 100644 index 00000000..ae2cb73f --- /dev/null +++ b/Assets/Scripts/Commands/CommandData.cs @@ -0,0 +1,21 @@ + +namespace Assets.Scripts.Commands +{ + public class CommandData + { + public int ActorUnitID; + public int TargetUnitID; + public int ActorPlayerID; + public int TargetPlayerID; + + public CommandData(int ActorUnitID, int TargetUnitID, int ActorPlayerID,int TargetPlayerID) + { + this.ActorUnitID = ActorUnitID; + this.TargetUnitID = TargetUnitID; + this.ActorPlayerID = ActorPlayerID; + this.TargetPlayerID = TargetPlayerID; + } + + + } +} diff --git a/Assets/Scripts/Commands/CommandData.cs.meta b/Assets/Scripts/Commands/CommandData.cs.meta new file mode 100644 index 00000000..637af35f --- /dev/null +++ b/Assets/Scripts/Commands/CommandData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d1a345a8402296141b19f6d5de9a760e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Commands/ConcreteCommands.meta b/Assets/Scripts/Commands/ConcreteCommands.meta new file mode 100644 index 00000000..3e3c9f0d --- /dev/null +++ b/Assets/Scripts/Commands/ConcreteCommands.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 91714cc78160b774fa2b377667622af5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Commands/ConcreteCommands/Attack.cs b/Assets/Scripts/Commands/ConcreteCommands/Attack.cs new file mode 100644 index 00000000..b26a33e5 --- /dev/null +++ b/Assets/Scripts/Commands/ConcreteCommands/Attack.cs @@ -0,0 +1,29 @@ +using Command.Main; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Commands.ConcreteCommands +{ + public class Attack: UnitCommands + { + private bool willHitTarget; + + public Attack(CommandData commandData) + { + this.commandData = commandData; + willHitTarget = WillHitTarget(); + } + public override void Execute() + { + GameService.Instance.ActionService.GetActionByType(Command.Actions.CommandType.Attack).PerformAction(actorUnit, targetUnit,willHitTarget); + } + public override bool WillHitTarget() + { + return true; + } + } +} diff --git a/Assets/Scripts/Commands/ConcreteCommands/Attack.cs.meta b/Assets/Scripts/Commands/ConcreteCommands/Attack.cs.meta new file mode 100644 index 00000000..21a0449d --- /dev/null +++ b/Assets/Scripts/Commands/ConcreteCommands/Attack.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1f5ed67f66086694587356820f7bbabc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Commands/ConcreteCommands/AttackStance.cs b/Assets/Scripts/Commands/ConcreteCommands/AttackStance.cs new file mode 100644 index 00000000..36f88036 --- /dev/null +++ b/Assets/Scripts/Commands/ConcreteCommands/AttackStance.cs @@ -0,0 +1,28 @@ +using Command.Main; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Commands.ConcreteCommands +{ + public class AttackStance: UnitCommands + { + private bool willHitTarget; + public AttackStance(CommandData commandData) + { + this.commandData=commandData; + willHitTarget = WillHitTarget(); + } + public override void Execute() + { + GameService.Instance.ActionService.GetActionByType(Command.Actions.CommandType.AttackStance).PerformAction(actorUnit, targetUnit, willHitTarget); + } + public override bool WillHitTarget() + { + return true; + } + + } +} diff --git a/Assets/Scripts/Commands/ConcreteCommands/AttackStance.cs.meta b/Assets/Scripts/Commands/ConcreteCommands/AttackStance.cs.meta new file mode 100644 index 00000000..e111e4d2 --- /dev/null +++ b/Assets/Scripts/Commands/ConcreteCommands/AttackStance.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5bca36c5da958ca45996e380824a337d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Commands/ConcreteCommands/BerserkAttack.cs b/Assets/Scripts/Commands/ConcreteCommands/BerserkAttack.cs new file mode 100644 index 00000000..257834aa --- /dev/null +++ b/Assets/Scripts/Commands/ConcreteCommands/BerserkAttack.cs @@ -0,0 +1,24 @@ + +using Command.Main; + +namespace Assets.Scripts.Commands.ConcreteCommands +{ + public class BerserkAttack:UnitCommands + { + private bool willHitTarget; + public BerserkAttack(CommandData commandData) + { + this.commandData = commandData; + willHitTarget = WillHitTarget(); + } + + public override void Execute() + { + GameService.Instance.ActionService.GetActionByType(Command.Actions.CommandType.BerserkAttack).PerformAction(actorUnit, targetUnit, willHitTarget); + } + public override bool WillHitTarget() + { + return true; + } + } +} diff --git a/Assets/Scripts/Commands/ConcreteCommands/BerserkAttack.cs.meta b/Assets/Scripts/Commands/ConcreteCommands/BerserkAttack.cs.meta new file mode 100644 index 00000000..102ca449 --- /dev/null +++ b/Assets/Scripts/Commands/ConcreteCommands/BerserkAttack.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0f4111972307514448f2d26b2fd1356b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Commands/ConcreteCommands/Cleanse.cs b/Assets/Scripts/Commands/ConcreteCommands/Cleanse.cs new file mode 100644 index 00000000..e5bbd719 --- /dev/null +++ b/Assets/Scripts/Commands/ConcreteCommands/Cleanse.cs @@ -0,0 +1,22 @@ +using Command.Main; + +namespace Assets.Scripts.Commands.ConcreteCommands +{ + public class Cleanse: UnitCommands + { + private bool willHitTarget; + public Cleanse(CommandData commandData) + { + this.commandData = commandData; + this.willHitTarget = WillHitTarget(); + } + public override void Execute() + { + GameService.Instance.ActionService.GetActionByType(Command.Actions.CommandType.Cleanse).PerformAction(actorUnit, targetUnit, willHitTarget); + } + public override bool WillHitTarget() + { + return true; + } + } +} diff --git a/Assets/Scripts/Commands/ConcreteCommands/Cleanse.cs.meta b/Assets/Scripts/Commands/ConcreteCommands/Cleanse.cs.meta new file mode 100644 index 00000000..9a427c84 --- /dev/null +++ b/Assets/Scripts/Commands/ConcreteCommands/Cleanse.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d263cb1bbd7dba349a3400e50e2ca297 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Commands/ConcreteCommands/Heal.cs b/Assets/Scripts/Commands/ConcreteCommands/Heal.cs new file mode 100644 index 00000000..c95558bb --- /dev/null +++ b/Assets/Scripts/Commands/ConcreteCommands/Heal.cs @@ -0,0 +1,28 @@ +using Command.Main; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Commands.ConcreteCommands +{ + public class Heal: UnitCommands + { + private bool willHitTarget; + public Heal(CommandData commandData) + { + this.commandData=commandData; + willHitTarget = WillHitTarget(); + } + + public override void Execute() + { + GameService.Instance.ActionService.GetActionByType(Command.Actions.CommandType.Heal).PerformAction(actorUnit, targetUnit, willHitTarget); + } + public override bool WillHitTarget() + { + return true; + } + } +} diff --git a/Assets/Scripts/Commands/ConcreteCommands/Heal.cs.meta b/Assets/Scripts/Commands/ConcreteCommands/Heal.cs.meta new file mode 100644 index 00000000..c6e194a4 --- /dev/null +++ b/Assets/Scripts/Commands/ConcreteCommands/Heal.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fbb2446917ce87443beff2845c6f7ea5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Commands/ConcreteCommands/Meditate.cs b/Assets/Scripts/Commands/ConcreteCommands/Meditate.cs new file mode 100644 index 00000000..99ab232a --- /dev/null +++ b/Assets/Scripts/Commands/ConcreteCommands/Meditate.cs @@ -0,0 +1,28 @@ +using Command.Main; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Commands.ConcreteCommands +{ + public class Meditate: UnitCommands + { + private bool willHitTarget; + + public Meditate(CommandData commandData) + { + this.commandData = commandData; + willHitTarget = WillHitTarget(); + } + public override void Execute() + { + GameService.Instance.ActionService.GetActionByType(Command.Actions.CommandType.Meditate).PerformAction(actorUnit, targetUnit, willHitTarget); + } + public override bool WillHitTarget() + { + return true; + } + } +} diff --git a/Assets/Scripts/Commands/ConcreteCommands/Meditate.cs.meta b/Assets/Scripts/Commands/ConcreteCommands/Meditate.cs.meta new file mode 100644 index 00000000..97f669f1 --- /dev/null +++ b/Assets/Scripts/Commands/ConcreteCommands/Meditate.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ecc00a0f21c209843be332f9060fb37d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Commands/ConcreteCommands/ThirdEye.cs b/Assets/Scripts/Commands/ConcreteCommands/ThirdEye.cs new file mode 100644 index 00000000..169d3fe6 --- /dev/null +++ b/Assets/Scripts/Commands/ConcreteCommands/ThirdEye.cs @@ -0,0 +1,27 @@ +using Command.Main; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Assets.Scripts.Commands.ConcreteCommands +{ + public class ThirdEye: UnitCommands + { + private bool willHitTarget; + public ThirdEye(CommandData commandData) + { + this.commandData = commandData; + willHitTarget = WillHitTarget(); + } + public override void Execute() + { + GameService.Instance.ActionService.GetActionByType(Command.Actions.CommandType.AttackStance).PerformAction(actorUnit, targetUnit, willHitTarget); + } + public override bool WillHitTarget() + { + return true; + } + } +} diff --git a/Assets/Scripts/Commands/ConcreteCommands/ThirdEye.cs.meta b/Assets/Scripts/Commands/ConcreteCommands/ThirdEye.cs.meta new file mode 100644 index 00000000..8e263245 --- /dev/null +++ b/Assets/Scripts/Commands/ConcreteCommands/ThirdEye.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 924af4d1047a0e341b953c5ae5c5c2ce +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Events/EventService.cs b/Assets/Scripts/Events/EventService.cs index 59b664c2..5c31f24f 100644 --- a/Assets/Scripts/Events/EventService.cs +++ b/Assets/Scripts/Events/EventService.cs @@ -11,12 +11,12 @@ namespace Command.Events public class EventService { public GameEventController OnBattleSelected { get; private set; } - public GameEventController OnActionSelected { get; private set; } + public GameEventController OnActionSelected { get; private set; } public EventService() { OnBattleSelected = new GameEventController(); - OnActionSelected = new GameEventController(); + OnActionSelected = new GameEventController(); } } } \ No newline at end of file diff --git a/Assets/Scripts/Input/InputService.cs b/Assets/Scripts/Input/InputService.cs index de088222..c1a0c318 100644 --- a/Assets/Scripts/Input/InputService.cs +++ b/Assets/Scripts/Input/InputService.cs @@ -9,7 +9,7 @@ public class InputService private MouseInputHandler mouseInputHandler; private InputState currentState; - private ActionType selectedActionType; + private CommandType selectedActionType; private TargetType targetType; public InputService() @@ -29,7 +29,7 @@ public void UpdateInputService() mouseInputHandler.HandleTargetSelection(targetType); } - public void OnActionSelected(ActionType selectedActionType) + public void OnActionSelected(CommandType selectedActionType) { this.selectedActionType = selectedActionType; SetInputState(InputState.SELECTING_TARGET); @@ -43,7 +43,7 @@ private void ShowTargetSelectionUI(TargetType selectedTargetType) GameService.Instance.UIService.ShowTargetOverlay(playerID, selectedTargetType); } - private TargetType SetTargetType(ActionType selectedActionType) => targetType = GameService.Instance.ActionService.GetTargetTypeForAction(selectedActionType); + private TargetType SetTargetType(CommandType selectedActionType) => targetType = GameService.Instance.ActionService.GetTargetTypeForAction(selectedActionType); public void OnTargetSelected(UnitController targetUnit) { diff --git a/Assets/Scripts/Player/PlayerService.cs b/Assets/Scripts/Player/PlayerService.cs index ec1f8bb4..7ee3e465 100644 --- a/Assets/Scripts/Player/PlayerService.cs +++ b/Assets/Scripts/Player/PlayerService.cs @@ -65,7 +65,7 @@ private void SetActivePlayer() public void OnPlayerTurnCompleted() => StartNextTurn(); - public void PerformAction(ActionType actionSelected, UnitController targetUnit) => GameService.Instance.ActionService.GetActionByType(actionSelected).PerformAction(activePlayer.GetUnitByID(ActiveUnitID), targetUnit); + public void PerformAction(CommandType actionSelected, UnitController targetUnit) => GameService.Instance.ActionService.GetActionByType(actionSelected).PerformAction(activePlayer.GetUnitByID(ActiveUnitID), targetUnit); public void PlayerDied(PlayerController deadPlayer) { diff --git a/Assets/Scripts/Player/Unit/UnitController.cs b/Assets/Scripts/Player/Unit/UnitController.cs index 863dc14f..edbbea46 100644 --- a/Assets/Scripts/Player/Unit/UnitController.cs +++ b/Assets/Scripts/Player/Unit/UnitController.cs @@ -91,19 +91,19 @@ private void UnitDied() unitView.PlayAnimation(UnitAnimations.DEATH); } - public void PlayBattleAnimation(ActionType actionType, Vector3 battlePosition, Action callback) + public void PlayBattleAnimation(CommandType actionType, Vector3 battlePosition, Action callback) { GameService.Instance.UIService.ResetBattleBackgroundOverlay(); MoveToBattlePosition(battlePosition, callback, true, actionType); } - private void MoveToBattlePosition(Vector3 battlePosition, Action callback = null, bool shouldPlayActionAnimation = true, ActionType actionTypeToExecute = ActionType.None) + private void MoveToBattlePosition(Vector3 battlePosition, Action callback = null, bool shouldPlayActionAnimation = true, CommandType actionTypeToExecute = CommandType.None) { float moveTime = Vector3.Distance(unitView.transform.position, battlePosition) / unitScriptableObject.MovementSpeed; unitView.StartCoroutine(MoveToPositionOverTime(battlePosition, moveTime, callback, shouldPlayActionAnimation, actionTypeToExecute)); } - private IEnumerator MoveToPositionOverTime(Vector3 targetPosition, float time, Action callback, bool shouldPlayActionAnimation, ActionType actionTypeToExecute) + private IEnumerator MoveToPositionOverTime(Vector3 targetPosition, float time, Action callback, bool shouldPlayActionAnimation, CommandType actionTypeToExecute) { float elapsedTime = 0; Vector3 startingPosition = unitView.transform.position; @@ -124,9 +124,9 @@ private IEnumerator MoveToPositionOverTime(Vector3 targetPosition, float time, A callback.Invoke(); } - private void PlayActionAnimation(ActionType actionType) + private void PlayActionAnimation(CommandType actionType) { - if (actionType == ActionType.None) + if (actionType == CommandType.None) return; if (actionType == unitScriptableObject.executableCommands[0]) diff --git a/Assets/Scripts/Player/Unit/UnitScriptableObject.cs b/Assets/Scripts/Player/Unit/UnitScriptableObject.cs index 3c0b6305..00badda8 100644 --- a/Assets/Scripts/Player/Unit/UnitScriptableObject.cs +++ b/Assets/Scripts/Player/Unit/UnitScriptableObject.cs @@ -12,7 +12,7 @@ public class UnitScriptableObject : ScriptableObject public UnitView UnitPrefab; public int MaxHealth; public int Power; - public List executableCommands; + public List executableCommands; public Vector3 EnemyBattlePositionOffset; public float MovementSpeed; } diff --git a/Assets/Scripts/UI/ActionSelectionUI/ActionButtonView.cs b/Assets/Scripts/UI/ActionSelectionUI/ActionButtonView.cs index f3016d06..ad4697a5 100644 --- a/Assets/Scripts/UI/ActionSelectionUI/ActionButtonView.cs +++ b/Assets/Scripts/UI/ActionSelectionUI/ActionButtonView.cs @@ -9,7 +9,7 @@ public class ActionButtonView : MonoBehaviour { [SerializeField] private TextMeshProUGUI buttonText; private ActionSelectionUIController owner; - private ActionType actionType; + private CommandType actionType; private void Start() => GetComponent