From 2851a85d1cd31afded516a3c32c9b4b157fccf8e Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Mon, 31 Mar 2025 10:34:04 +0300 Subject: [PATCH] Small change of message type assigning --- Codegen.Basic/Codegen.Basic.csproj | 22 ----- Codegen.Basic/Program.cs | 25 ------ Codegen.Basic/exampleTemplate.cstmpl | 19 ---- mROA.Codegen/RemoteTypeBinder.cstmpl | 2 +- mROA.Codegen/mROASourceGenerator.cs | 4 - mROA.CodegenTools/DefineTemplateSection.cs | 32 ------- mROA.CodegenTools/ITemplateSection.cs | 21 ----- mROA.CodegenTools/InnerTemplateSection.cs | 25 ------ mROA.CodegenTools/InsertTemplatePart.cs | 74 ---------------- mROA.CodegenTools/LinkTemplateSection.cs | 43 ---------- mROA.CodegenTools/LiteralTemplateSection.cs | 31 ------- mROA.CodegenTools/ProgrammableTextSection.cs | 29 ------- .../Reading/DefineSectionReader.cs | 24 ------ mROA.CodegenTools/Reading/ISectionReader.cs | 11 --- .../Reading/InnerTemplateSectionReader.cs | 39 --------- .../Reading/InsertSectionReader.cs | 24 ------ .../Reading/LeadingTextSectionReader.cs | 38 -------- .../Reading/LinkSectionReader.cs | 20 ----- mROA.CodegenTools/Reading/TemplateReader.cs | 86 ------------------- mROA.CodegenTools/TemplateDocument.cs | 54 ------------ mROA.CodegenTools/mROA.CodegenTools.csproj | 8 -- mROA.Test/NextGenTest.cs | 2 +- mROA.sln | 13 --- mROA/Abstract/ICommandExecution.cs | 3 +- mROA/Abstract/IInteractionModule.cs | 10 +-- mROA/Abstract/ISerialisationModule.cs | 14 +-- .../Backend/BasicExecutionModule.cs | 4 +- .../Backend/NetworkGatewayModule.cs | 4 +- .../CommandExecution/AsyncCommandExecution.cs | 1 + .../ExceptionCommandExecution.cs | 1 + .../CommandExecution/FinalCommandExecution.cs | 1 + .../Frontend/NetworkFrontendBridge.cs | 4 +- .../Frontend/RequestExtractor.cs | 16 ++-- mROA/Implementation/IdAssignment.cs | 4 +- ...workMessage.cs => NetworkMessageHeader.cs} | 15 +++- .../NextGenerationInteractionModule.cs | 22 ++--- mROA/Implementation/RemoteObjectBase.cs | 16 ++-- mROA/Implementation/RepresentationModule.cs | 28 +++--- 38 files changed, 78 insertions(+), 711 deletions(-) delete mode 100644 Codegen.Basic/Codegen.Basic.csproj delete mode 100644 Codegen.Basic/Program.cs delete mode 100644 Codegen.Basic/exampleTemplate.cstmpl delete mode 100644 mROA.CodegenTools/DefineTemplateSection.cs delete mode 100644 mROA.CodegenTools/ITemplateSection.cs delete mode 100644 mROA.CodegenTools/InnerTemplateSection.cs delete mode 100644 mROA.CodegenTools/InsertTemplatePart.cs delete mode 100644 mROA.CodegenTools/LinkTemplateSection.cs delete mode 100644 mROA.CodegenTools/LiteralTemplateSection.cs delete mode 100644 mROA.CodegenTools/ProgrammableTextSection.cs delete mode 100644 mROA.CodegenTools/Reading/DefineSectionReader.cs delete mode 100644 mROA.CodegenTools/Reading/ISectionReader.cs delete mode 100644 mROA.CodegenTools/Reading/InnerTemplateSectionReader.cs delete mode 100644 mROA.CodegenTools/Reading/InsertSectionReader.cs delete mode 100644 mROA.CodegenTools/Reading/LeadingTextSectionReader.cs delete mode 100644 mROA.CodegenTools/Reading/LinkSectionReader.cs delete mode 100644 mROA.CodegenTools/Reading/TemplateReader.cs delete mode 100644 mROA.CodegenTools/TemplateDocument.cs delete mode 100644 mROA.CodegenTools/mROA.CodegenTools.csproj rename mROA/Implementation/{NetworkMessage.cs => NetworkMessageHeader.cs} (57%) diff --git a/Codegen.Basic/Codegen.Basic.csproj b/Codegen.Basic/Codegen.Basic.csproj deleted file mode 100644 index 45c45ba..0000000 --- a/Codegen.Basic/Codegen.Basic.csproj +++ /dev/null @@ -1,22 +0,0 @@ - - - - Exe - net9.0 - enable - enable - BasicDemo - - - - - - - - - - Always - - - - diff --git a/Codegen.Basic/Program.cs b/Codegen.Basic/Program.cs deleted file mode 100644 index de86019..0000000 --- a/Codegen.Basic/Program.cs +++ /dev/null @@ -1,25 +0,0 @@ -// See https://aka.ms/new-console-template for more information - -using mROA.CodegenTools; - -// var doc = new TemplateDocument(); -// doc.Parts = new List -// { -// new LiteralTemplateSection("teset text", doc), -// new DefineTemplateSection(" another text which is dinided, bun not placed ", "text define", doc), -// new LinkTemplateSection("text define", doc), -// new LinkTemplateSection("text define", doc), -// new LinkTemplateSection("text define", doc), -// new LiteralTemplateSection(" = = = ", doc), -// new InsertTemplatePart("insert", doc), -// new LinkTemplateSection("post", doc) -// }; -// -// doc.Insert("insert", "inserted text by insert template => "); -// doc.Parts.Add(new DefineTemplateSection("post added", "post", doc)); -// Console.WriteLine(doc.Compile()); -var doc = TemplateReader.FromEmbeddedResource("exampleTemplate.cstmpl"); -doc.Insert("ctorInserting", "test inserting"); -Console.WriteLine(doc.Compile()); - -Console.WriteLine(doc.Parts.Count); \ No newline at end of file diff --git a/Codegen.Basic/exampleTemplate.cstmpl b/Codegen.Basic/exampleTemplate.cstmpl deleted file mode 100644 index 5e47243..0000000 --- a/Codegen.Basic/exampleTemplate.cstmpl +++ /dev/null @@ -1,19 +0,0 @@ -public class A -{ - - - - Some literal for test - test text with definition in template - - - - - - - public void () - { - Console.WriteLine(""); - } - -} \ No newline at end of file diff --git a/mROA.Codegen/RemoteTypeBinder.cstmpl b/mROA.Codegen/RemoteTypeBinder.cstmpl index 4e7374b..be2bf42 100644 --- a/mROA.Codegen/RemoteTypeBinder.cstmpl +++ b/mROA.Codegen/RemoteTypeBinder.cstmpl @@ -39,7 +39,7 @@ namespace mROA.Codegen Parameters = new object[] { } }; - module.PostCallMessageAsync(request.Id, MessageType.EventRequest, request); + module.PostCallMessageAsync(request.Id, EMessageType.EventRequest, request); }; } diff --git a/mROA.Codegen/mROASourceGenerator.cs b/mROA.Codegen/mROASourceGenerator.cs index 15407b5..6329ab2 100644 --- a/mROA.Codegen/mROASourceGenerator.cs +++ b/mROA.Codegen/mROASourceGenerator.cs @@ -173,10 +173,6 @@ namespace mROA.Codegen { var coCodegenRepoCode = _methodRepoTemplate.Compile(); #if !DONT_ADD - var template = TemplateReader.FromEmbeddedResource("TestClass.cstmpl"); - template.AddDefine("param", "System.Int32 i"); - - context.AddSource("TestClass.g.cs", SourceText.From(template.Compile(), Encoding.UTF8)); context.AddSource("CoCodegenMethodRepository.g.cs", SourceText.From(coCodegenRepoCode, Encoding.UTF8)); #endif } diff --git a/mROA.CodegenTools/DefineTemplateSection.cs b/mROA.CodegenTools/DefineTemplateSection.cs deleted file mode 100644 index fcc926e..0000000 --- a/mROA.CodegenTools/DefineTemplateSection.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; - -namespace mROA.CodegenTools -{ - public class DefineTemplateSection : ITagged - { - public TemplateDocument Context { get; set; } - public string StoredText { get; } - private readonly string _tag; - - public DefineTemplateSection(string storedText, string tag, TemplateDocument context) - { - StoredText = storedText; - _tag = tag; - Context = context; - } - - public string Tag => _tag; - public int TargetLength => StoredText.Length; - - - public override string ToString() - { - return StoredText; - } - - public object Clone() - { - return new DefineTemplateSection(StoredText, _tag, Context); - } - } -} \ No newline at end of file diff --git a/mROA.CodegenTools/ITemplateSection.cs b/mROA.CodegenTools/ITemplateSection.cs deleted file mode 100644 index 7712282..0000000 --- a/mROA.CodegenTools/ITemplateSection.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; - -namespace mROA.CodegenTools -{ - public interface ITemplateSection : ICloneable - { - TemplateDocument Context { get; set; } - int TargetLength { get; } - } - - public interface IBaking - { - string Bake(); - } - - - public interface ITagged : ITemplateSection - { - string Tag { get; } - } -} \ No newline at end of file diff --git a/mROA.CodegenTools/InnerTemplateSection.cs b/mROA.CodegenTools/InnerTemplateSection.cs deleted file mode 100644 index f347086..0000000 --- a/mROA.CodegenTools/InnerTemplateSection.cs +++ /dev/null @@ -1,25 +0,0 @@ -namespace mROA.CodegenTools -{ - public class InnerTemplateSection : ITemplateSection, ITagged - { - private readonly string _tag; - public TemplateDocument Context { get; set; } - public int TargetLength => 0; - - public string Tag => _tag; - - public TemplateDocument InnerTemplate { get; } - - public InnerTemplateSection(string tag, TemplateDocument innerTemplate, TemplateDocument context) - { - _tag = tag; - Context = context; - InnerTemplate = innerTemplate; - } - - public object Clone() - { - return new InnerTemplateSection(_tag, InnerTemplate, Context); - } - } -} \ No newline at end of file diff --git a/mROA.CodegenTools/InsertTemplatePart.cs b/mROA.CodegenTools/InsertTemplatePart.cs deleted file mode 100644 index fbc8f53..0000000 --- a/mROA.CodegenTools/InsertTemplatePart.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace mROA.CodegenTools -{ - public class InsertTemplatePart : ITagged, IBaking - { - private object _insertedValue; - private string _tag; - public string Tag => _tag; - public TemplateDocument Context { get; set; } - public readonly List Parameters; - - public InsertTemplatePart(string tag, TemplateDocument context, params string[] parameters) - { - _tag = tag; - Parameters = parameters.ToList(); - Context = context; - } - - private bool IsInserted(object value) - { - if (Parameters.IndexOf("R") == 0) return false; - - ProduceInserted(value); - - return true; - } - - private void ProduceInserted(object value) - { - var currentIndex = Context.Parts.IndexOf(this); - var clone = (InsertTemplatePart)MemberwiseClone(); - clone._tag += "+"; - - clone._insertedValue = value; - - Context.Parts.Insert(currentIndex, clone); - } - - - public void Setup(object value) - { - if (!(value is string) && !(value is ITemplateSection) ) - return; - if (IsInserted(value)) - return; - - _insertedValue = value; - } - - - public int TargetLength => 0; - - public string Bake() - { - switch (_insertedValue) - { - case null: - return string.Empty; - case string s: - return s; - default: - return ((ITemplateSection)_insertedValue).ToString(); - } - } - - public object Clone() - { - return new InsertTemplatePart(_tag, Context, Parameters.ToArray()); - } - } -} \ No newline at end of file diff --git a/mROA.CodegenTools/LinkTemplateSection.cs b/mROA.CodegenTools/LinkTemplateSection.cs deleted file mode 100644 index 8870674..0000000 --- a/mROA.CodegenTools/LinkTemplateSection.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System.Linq; - -namespace mROA.CodegenTools -{ - public class LinkTemplateSection : ITemplateSection, IBaking - { - private readonly string _linkedTag; - - public LinkTemplateSection(string linkedTag, TemplateDocument context) - { - _linkedTag = linkedTag; - Context = context; - } - - public TemplateDocument Context { get; set; } - - public string LinkedTag => _linkedTag; - - public int TargetLength - { - get - { - var attached = Context[_linkedTag]; - return attached?.TargetLength ?? 0; - } - } - - public string Bake() - { - return Context[_linkedTag]?.ToString(); - } - - public override string ToString() - { - return $"{nameof(LinkedTag)}: {_linkedTag}"; - } - - public object Clone() - { - return new LinkTemplateSection(_linkedTag, Context); - } - } -} \ No newline at end of file diff --git a/mROA.CodegenTools/LiteralTemplateSection.cs b/mROA.CodegenTools/LiteralTemplateSection.cs deleted file mode 100644 index b28fe72..0000000 --- a/mROA.CodegenTools/LiteralTemplateSection.cs +++ /dev/null @@ -1,31 +0,0 @@ -namespace mROA.CodegenTools -{ - public class LiteralTemplateSection : ITemplateSection, IBaking - { - private string _internalText; - - public LiteralTemplateSection(string internalText, TemplateDocument context) - { - _internalText = internalText; - Context = context; - } - - public TemplateDocument Context { get; set; } - public int TargetLength => _internalText.Length; - - public string Bake() - { - return ToString(); - } - - public override string ToString() - { - return _internalText; - } - - public object Clone() - { - return new LiteralTemplateSection(_internalText, Context); - } - } -} \ No newline at end of file diff --git a/mROA.CodegenTools/ProgrammableTextSection.cs b/mROA.CodegenTools/ProgrammableTextSection.cs deleted file mode 100644 index 5d91bd5..0000000 --- a/mROA.CodegenTools/ProgrammableTextSection.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System; - -namespace mROA.CodegenTools -{ - public class ProgrammableTextSection : ITemplateSection, IBaking - { - public TemplateDocument Context { get; set; } - public int TargetLength => 0; - - private Func _bakeFunc; - - public ProgrammableTextSection(Func bakeFunc, TemplateDocument context) - { - _bakeFunc = bakeFunc; - Context = context; - } - - - public string Bake() - { - return _bakeFunc(Context.AdditionalContext); - } - - public object Clone() - { - return new ProgrammableTextSection(_bakeFunc, Context); - } - } -} \ No newline at end of file diff --git a/mROA.CodegenTools/Reading/DefineSectionReader.cs b/mROA.CodegenTools/Reading/DefineSectionReader.cs deleted file mode 100644 index 5d4f7e0..0000000 --- a/mROA.CodegenTools/Reading/DefineSectionReader.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; - -namespace mROA.CodegenTools -{ - public class DefineSectionReader : LeadingTextSectionReader - { - public DefineSectionReader() : base("", index, StringComparison.Ordinal); - var sectionName = GetTagValue(index, tagEnd); - tagEnd += 1; - var endIndex = TemplateText.IndexOf("", tagEnd, StringComparison.Ordinal); - var storedText = TemplateText.Substring(tagEnd, endIndex - tagEnd); - index = endIndex + 4; - PassCaretToCloseSymbol(); - PassCaretToCloseSymbol(); - return new DefineTemplateSection(storedText, sectionName, document); - } - } -} \ No newline at end of file diff --git a/mROA.CodegenTools/Reading/ISectionReader.cs b/mROA.CodegenTools/Reading/ISectionReader.cs deleted file mode 100644 index 0ed658e..0000000 --- a/mROA.CodegenTools/Reading/ISectionReader.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Collections.Generic; - -namespace mROA.CodegenTools -{ - public interface ISectionReader - { - string TemplateText { get; set; } - int GetNextSectionIndex(int currentIndex); - ITemplateSection ExtractSection(ref int index, TemplateDocument document); - } -} \ No newline at end of file diff --git a/mROA.CodegenTools/Reading/InnerTemplateSectionReader.cs b/mROA.CodegenTools/Reading/InnerTemplateSectionReader.cs deleted file mode 100644 index 9427874..0000000 --- a/mROA.CodegenTools/Reading/InnerTemplateSectionReader.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; - -namespace mROA.CodegenTools -{ - public class InnerTemplateSectionReader : LeadingTextSectionReader - { - public InnerTemplateSectionReader() - : base("", start, StringComparison.Ordinal); - var innerStartSymbol = TemplateText.IndexOf("", _currentCaretPosition, StringComparison.Ordinal) + 1; - return _currentCaretPosition; - } - - public string TemplateText { get; set; } - - public int GetNextSectionIndex(int currentIndex) - { - _currentCaretPosition = Math.Max(currentIndex, _currentCaretPosition); - var index = TemplateText.IndexOf(_tagLeading, _currentCaretPosition, StringComparison.Ordinal); - _currentCaretPosition = index; - return index; - } - - public abstract ITemplateSection ExtractSection(ref int index, TemplateDocument document); - - protected string GetTagValue(int from, int to) - { - return TemplateText.Substring(from + 4, to - from - 5); - } - } -} \ No newline at end of file diff --git a/mROA.CodegenTools/Reading/LinkSectionReader.cs b/mROA.CodegenTools/Reading/LinkSectionReader.cs deleted file mode 100644 index fece788..0000000 --- a/mROA.CodegenTools/Reading/LinkSectionReader.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace mROA.CodegenTools -{ - public class LinkSectionReader : LeadingTextSectionReader - { - public LinkSectionReader() : base(" ReaderTypes = new List - { - typeof(DefineSectionReader), - typeof(InsertSectionReader), - typeof(LinkSectionReader), - typeof(InnerTemplateSectionReader) - }; - - public static TemplateDocument Parse(string templateText) - { - - int currentIndex = 0; - var activeReaders = new List(); - - foreach (var readerType in ReaderTypes) - { - var reader = Activator.CreateInstance(readerType) as ISectionReader; - reader.TemplateText = templateText; - activeReaders.Add(reader); - } - - var doc = new TemplateDocument(); - - while (currentIndex < templateText.Length) - { - List<(ISectionReader reader, int index)> indices = activeReaders.Select(i => ((ISectionReader Readers, int index))(i, i.GetNextSectionIndex(currentIndex))).Where(i => i.index > -1).ToList(); - int minIndex = templateText.Length; - ISectionReader minReader = null; - if (indices.Count != 0) - { - minIndex = indices.Min(i => i.index); - minReader = indices.FirstOrDefault(i => i.index == minIndex).reader; - - if (indices.Count != activeReaders.Count) - { - activeReaders = indices.Select(i => i.reader).ToList(); - } - } - - - if (currentIndex != minIndex) - { - var literalText = templateText.Substring(currentIndex, minIndex - currentIndex); - var literal = - new LiteralTemplateSection(literalText, doc); - doc.Parts.Add(literal); - currentIndex = minIndex; - } - - if (indices.Count != 0) - { - var section = minReader.ExtractSection(ref currentIndex, doc); - doc.Parts.Add(section); - } - - - } - - return doc; - } - - public static TemplateDocument FromEmbeddedResource(string resourceName) - { - return FromEmbeddedResource(resourceName, Assembly.GetCallingAssembly()); - } - - public static TemplateDocument FromEmbeddedResource(string resourceName, Assembly assembly) - { - var fileName = assembly.GetManifestResourceNames().First(n => n.EndsWith(resourceName)); - var res = assembly.GetManifestResourceStream(fileName); - var reader = new StreamReader(res); - var templateText = reader.ReadToEnd(); - return Parse(templateText); - } - } -} \ No newline at end of file diff --git a/mROA.CodegenTools/TemplateDocument.cs b/mROA.CodegenTools/TemplateDocument.cs deleted file mode 100644 index 71319c2..0000000 --- a/mROA.CodegenTools/TemplateDocument.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace mROA.CodegenTools -{ - public class TemplateDocument : ICloneable - { - public List Parts { get; set; } = new List(); - public object AdditionalContext { get; set; } - public ITagged this[string tag] => Parts.OfType().FirstOrDefault(i => i.Tag == tag); - - public void Insert(string tag, object value) - { - var selectedPart = this[tag]; - if (selectedPart is InsertTemplatePart itp) - { - itp.Setup(value); - } - } - - public string Compile() - { - var approximatelyLength = Parts.Sum(i => i.TargetLength); - var stringBuilder = new StringBuilder(approximatelyLength); - - foreach (var part in Parts.OfType()) - { - var baked = part.Bake(); - stringBuilder.Append(baked); - } - - return stringBuilder.ToString(); - } - - public object Clone() - { - var cloneDoc = new TemplateDocument - { - AdditionalContext = AdditionalContext is ICloneable c ? c.Clone() : AdditionalContext - }; - - cloneDoc.Parts = Parts.Select(i => - { - var clone = i.Clone() as ITemplateSection; - clone.Context = cloneDoc; - return clone; - }).ToList(); - - return cloneDoc; - } - } -} \ No newline at end of file diff --git a/mROA.CodegenTools/mROA.CodegenTools.csproj b/mROA.CodegenTools/mROA.CodegenTools.csproj deleted file mode 100644 index d9c2ee6..0000000 --- a/mROA.CodegenTools/mROA.CodegenTools.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - - netstandard2.0 - 8 - - - diff --git a/mROA.Test/NextGenTest.cs b/mROA.Test/NextGenTest.cs index 8eaebb0..02c2fe1 100644 --- a/mROA.Test/NextGenTest.cs +++ b/mROA.Test/NextGenTest.cs @@ -37,7 +37,7 @@ namespace mROA.Test foreach (var guid in guids) { - _interactionModuleB.PostMessage(new NetworkMessage { Id = guid, Data = "Hello user"u8.ToArray() }); + _interactionModuleB.PostMessage(new NetworkMessageHeader { Id = guid, Data = "Hello user"u8.ToArray() }); } }); diff --git a/mROA.sln b/mROA.sln index e382133..2c090e8 100644 --- a/mROA.sln +++ b/mROA.sln @@ -23,12 +23,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mROA.Cbor", "mROA.Cbor\mROA EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TotalDemo", "TotalDemo", "{FC4FA752-10A7-4D78-A7C2-9BCD8A81FB5E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mROA.CodegenTools", "mROA.CodegenTools\mROA.CodegenTools.csproj", "{2A2821B7-E5C5-443A-9801-9622493594A0}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Codegen", "Codegen", "{3DB22457-E65B-426F-B3DD-08C615132B3E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Codegen.Basic", "Codegen.Basic\Codegen.Basic.csproj", "{87396E86-D7ED-4556-AB50-F3696FEF9072}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -67,14 +63,6 @@ Global {6211E4EA-13FD-4EB1-8E6A-C0173DD0784A}.Debug|Any CPU.Build.0 = Debug|Any CPU {6211E4EA-13FD-4EB1-8E6A-C0173DD0784A}.Release|Any CPU.ActiveCfg = Release|Any CPU {6211E4EA-13FD-4EB1-8E6A-C0173DD0784A}.Release|Any CPU.Build.0 = Release|Any CPU - {2A2821B7-E5C5-443A-9801-9622493594A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2A2821B7-E5C5-443A-9801-9622493594A0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2A2821B7-E5C5-443A-9801-9622493594A0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2A2821B7-E5C5-443A-9801-9622493594A0}.Release|Any CPU.Build.0 = Release|Any CPU - {87396E86-D7ED-4556-AB50-F3696FEF9072}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {87396E86-D7ED-4556-AB50-F3696FEF9072}.Debug|Any CPU.Build.0 = Debug|Any CPU - {87396E86-D7ED-4556-AB50-F3696FEF9072}.Release|Any CPU.ActiveCfg = Release|Any CPU - {87396E86-D7ED-4556-AB50-F3696FEF9072}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -85,6 +73,5 @@ Global {9BD25A13-3165-47C0-9EAA-5C59EC490E32} = {FC4FA752-10A7-4D78-A7C2-9BCD8A81FB5E} {E7703F5B-F2A6-4A88-AA57-EBB1E38D533E} = {FC4FA752-10A7-4D78-A7C2-9BCD8A81FB5E} {3DB22457-E65B-426F-B3DD-08C615132B3E} = {EAE92F5A-664C-41AB-8811-5885524B5347} - {87396E86-D7ED-4556-AB50-F3696FEF9072} = {3DB22457-E65B-426F-B3DD-08C615132B3E} EndGlobalSection EndGlobal diff --git a/mROA/Abstract/ICommandExecution.cs b/mROA/Abstract/ICommandExecution.cs index 5037a4e..e546c68 100644 --- a/mROA/Abstract/ICommandExecution.cs +++ b/mROA/Abstract/ICommandExecution.cs @@ -1,8 +1,9 @@ using System; +using mROA.Implementation; namespace mROA.Abstract { - public interface ICommandExecution + public interface ICommandExecution : INetworkMessage { Guid Id { get; set; } } diff --git a/mROA/Abstract/IInteractionModule.cs b/mROA/Abstract/IInteractionModule.cs index dc45dbf..0939528 100644 --- a/mROA/Abstract/IInteractionModule.cs +++ b/mROA/Abstract/IInteractionModule.cs @@ -9,10 +9,10 @@ namespace mROA.Abstract { int ConnectionId { get; } public Stream? BaseStream { get; set; } - Task GetNextMessageReceiving(); - Task PostMessage(NetworkMessage message); - void HandleMessage(NetworkMessage message); - NetworkMessage[] UnhandledMessages { get; } - NetworkMessage? FirstByFilter(Predicate predicate); + Task GetNextMessageReceiving(); + Task PostMessage(NetworkMessageHeader messageHeader); + void HandleMessage(NetworkMessageHeader messageHeader); + NetworkMessageHeader[] UnhandledMessages { get; } + NetworkMessageHeader? FirstByFilter(Predicate predicate); } } \ No newline at end of file diff --git a/mROA/Abstract/ISerialisationModule.cs b/mROA/Abstract/ISerialisationModule.cs index 17e7911..4cea03f 100644 --- a/mROA/Abstract/ISerialisationModule.cs +++ b/mROA/Abstract/ISerialisationModule.cs @@ -9,17 +9,17 @@ namespace mROA.Abstract { int Id { get; } - Task GetMessageAsync(Guid? requestId = null, MessageType? messageType = null, + Task GetMessageAsync(Guid? requestId = null, EMessageType? messageType = null, CancellationToken token = default); - T GetMessage(Guid? requestId = null, MessageType? messageType = null); + T GetMessage(Guid? requestId = null, EMessageType? messageType = null); - Task GetRawMessage(Guid? requestId = null, MessageType? messageType = null, + Task GetRawMessage(Guid? requestId = null, EMessageType? messageType = null, CancellationToken token = default); - Task PostCallMessageAsync(Guid id, MessageType messageType, T payload) where T : notnull; - Task PostCallMessageAsync(Guid id, MessageType messageType, object payload, Type payloadType); - void PostCallMessage(Guid id, MessageType messageType, T payload) where T : notnull; - void PostCallMessage(Guid id, MessageType messageType, object payload, Type payloadType); + Task PostCallMessageAsync(Guid id, EMessageType eMessageType, T payload) where T : notnull; + Task PostCallMessageAsync(Guid id, EMessageType eMessageType, object payload, Type payloadType); + void PostCallMessage(Guid id, EMessageType eMessageType, T payload) where T : notnull; + void PostCallMessage(Guid id, EMessageType eMessageType, object payload, Type payloadType); } } \ No newline at end of file diff --git a/mROA/Implementation/Backend/BasicExecutionModule.cs b/mROA/Implementation/Backend/BasicExecutionModule.cs index 25b96c1..f184d20 100644 --- a/mROA/Implementation/Backend/BasicExecutionModule.cs +++ b/mROA/Implementation/Backend/BasicExecutionModule.cs @@ -198,7 +198,7 @@ namespace mROA.Implementation.Backend TransmissionConfig.OwnershipRepository as MultiClientOwnershipRepository; multiClientOwnershipRepository?.RegisterOwnership(representationModule.Id); - representationModule.PostCallMessage(command.Id, MessageType.FinishedCommandExecution, payload); + representationModule.PostCallMessage(command.Id, EMessageType.FinishedCommandExecution, payload); multiClientOwnershipRepository?.FreeOwnership(); }); @@ -240,7 +240,7 @@ namespace mROA.Implementation.Backend var multiClientOwnershipRepository = TransmissionConfig.OwnershipRepository as MultiClientOwnershipRepository; multiClientOwnershipRepository?.RegisterOwnership(representationModule.Id); - representationModule.PostCallMessage(command.Id, MessageType.FinishedCommandExecution, + representationModule.PostCallMessage(command.Id, EMessageType.FinishedCommandExecution, payload); multiClientOwnershipRepository?.FreeOwnership(); }); diff --git a/mROA/Implementation/Backend/NetworkGatewayModule.cs b/mROA/Implementation/Backend/NetworkGatewayModule.cs index d7bf45d..56d7bea 100644 --- a/mROA/Implementation/Backend/NetworkGatewayModule.cs +++ b/mROA/Implementation/Backend/NetworkGatewayModule.cs @@ -75,9 +75,9 @@ namespace mROA.Implementation.Backend interaction.BaseStream = client.GetStream(); - interaction.PostMessage(new NetworkMessage + interaction.PostMessage(new NetworkMessageHeader { - Id = Guid.NewGuid(), SchemaId = MessageType.IdAssigning, + Id = Guid.NewGuid(), EMessageType = EMessageType.IdAssigning, Data = _serialization!.Serialize(new IdAssignment { Id = -interaction.ConnectionId }) }); _hub!.RegisterInteraction(interaction); diff --git a/mROA/Implementation/CommandExecution/AsyncCommandExecution.cs b/mROA/Implementation/CommandExecution/AsyncCommandExecution.cs index 7dea41d..deb3299 100644 --- a/mROA/Implementation/CommandExecution/AsyncCommandExecution.cs +++ b/mROA/Implementation/CommandExecution/AsyncCommandExecution.cs @@ -6,5 +6,6 @@ namespace mROA.Implementation.CommandExecution public class AsyncCommandExecution : ICommandExecution { public Guid Id { get; set; } + public EMessageType MessageType => EMessageType.Unknown; } } \ No newline at end of file diff --git a/mROA/Implementation/CommandExecution/ExceptionCommandExecution.cs b/mROA/Implementation/CommandExecution/ExceptionCommandExecution.cs index 82a63de..3199141 100644 --- a/mROA/Implementation/CommandExecution/ExceptionCommandExecution.cs +++ b/mROA/Implementation/CommandExecution/ExceptionCommandExecution.cs @@ -7,6 +7,7 @@ namespace mROA.Implementation.CommandExecution public class ExceptionCommandExecution : ICommandExecution { public Guid Id { get; set; } + public EMessageType MessageType => EMessageType.ExceptionCommandExecution; public string Exception { get; set; } public RemoteException GetException() diff --git a/mROA/Implementation/CommandExecution/FinalCommandExecution.cs b/mROA/Implementation/CommandExecution/FinalCommandExecution.cs index fba0dca..c94a4d1 100644 --- a/mROA/Implementation/CommandExecution/FinalCommandExecution.cs +++ b/mROA/Implementation/CommandExecution/FinalCommandExecution.cs @@ -8,6 +8,7 @@ namespace mROA.Implementation.CommandExecution public class FinalCommandExecution : ICommandExecution { public Guid Id { get; set; } + public EMessageType MessageType => EMessageType.FinishedCommandExecution; } public class FinalCommandExecution : FinalCommandExecution diff --git a/mROA/Implementation/Frontend/NetworkFrontendBridge.cs b/mROA/Implementation/Frontend/NetworkFrontendBridge.cs index 8bd0aba..86a7d79 100644 --- a/mROA/Implementation/Frontend/NetworkFrontendBridge.cs +++ b/mROA/Implementation/Frontend/NetworkFrontendBridge.cs @@ -40,10 +40,10 @@ namespace mROA.Implementation.Frontend _tcpClient.Connect(_ipEndPoint); _interactionModule.BaseStream = _tcpClient.GetStream(); var welcomeMessage = _interactionModule.GetNextMessageReceiving().GetAwaiter().GetResult(); - if (welcomeMessage.SchemaId != MessageType.IdAssigning) + if (welcomeMessage.EMessageType != EMessageType.IdAssigning) { throw new Exception( - $"Incorrect message type. Must be IdAssigning, current : {welcomeMessage.SchemaId.ToString()}"); + $"Incorrect message type. Must be IdAssigning, current : {welcomeMessage.EMessageType.ToString()}"); } diff --git a/mROA/Implementation/Frontend/RequestExtractor.cs b/mROA/Implementation/Frontend/RequestExtractor.cs index 0cc961a..f794595 100644 --- a/mROA/Implementation/Frontend/RequestExtractor.cs +++ b/mROA/Implementation/Frontend/RequestExtractor.cs @@ -73,13 +73,13 @@ namespace mROA.Implementation.Frontend var token = tokenSource.Token; var defaultRequest = _representationModule!.GetMessageAsync( - messageType: MessageType.CallRequest, token: token); + messageType: EMessageType.CallRequest, token: token); var cancelRequest = _representationModule!.GetMessageAsync( - messageType: MessageType.CancelRequest, token: token); + messageType: EMessageType.CancelRequest, token: token); var eventRequest = _representationModule!.GetMessageAsync( - messageType: MessageType.EventRequest, token: token); + messageType: EMessageType.EventRequest, token: token); Task.WaitAny(defaultRequest, cancelRequest, eventRequest); #if TRACE Console.WriteLine("Request received"); @@ -135,13 +135,9 @@ namespace mROA.Implementation.Frontend var result = _executeModule!.Execute(request, _realContextRepository!, _representationModule!); - var resultType = result switch - { - FinalCommandExecution => MessageType.FinishedCommandExecution, - ExceptionCommandExecution => MessageType.ExceptionCommandExecution, - _ => MessageType.Unknown - }; - if (resultType == MessageType.Unknown) + var resultType = result.MessageType; + + if (resultType == EMessageType.Unknown) { return; } diff --git a/mROA/Implementation/IdAssignment.cs b/mROA/Implementation/IdAssignment.cs index 427124b..a48a56a 100644 --- a/mROA/Implementation/IdAssignment.cs +++ b/mROA/Implementation/IdAssignment.cs @@ -1,7 +1,9 @@ namespace mROA.Implementation { - public class IdAssignment + public class IdAssignment : INetworkMessage { public int Id { get; set; } + + public EMessageType MessageType => EMessageType.IdAssigning; } } \ No newline at end of file diff --git a/mROA/Implementation/NetworkMessage.cs b/mROA/Implementation/NetworkMessageHeader.cs similarity index 57% rename from mROA/Implementation/NetworkMessage.cs rename to mROA/Implementation/NetworkMessageHeader.cs index e610586..edbe3d5 100644 --- a/mROA/Implementation/NetworkMessage.cs +++ b/mROA/Implementation/NetworkMessageHeader.cs @@ -1,21 +1,27 @@ using System; using System.Text.Json.Serialization; +using mROA.Implementation.Attributes; // ReSharper disable UnusedMember.Global namespace mROA.Implementation { - public class NetworkMessage + public interface INetworkMessage + { + [SerializationIgnore] + public EMessageType MessageType { get; } + } + public class NetworkMessageHeader { public Guid Id { get; set; } [JsonConverter(typeof(JsonStringEnumConverter))] - public MessageType SchemaId { get; set; } + public EMessageType EMessageType { get; set; } public byte[] Data { get; set; } } - public enum MessageType + public enum EMessageType { Unknown, FinishedCommandExecution, @@ -23,6 +29,7 @@ namespace mROA.Implementation CallRequest, IdAssigning, CancelRequest, - EventRequest + EventRequest, + ClientRecovery } } \ No newline at end of file diff --git a/mROA/Implementation/NextGenerationInteractionModule.cs b/mROA/Implementation/NextGenerationInteractionModule.cs index 2aa7163..f817e9b 100644 --- a/mROA/Implementation/NextGenerationInteractionModule.cs +++ b/mROA/Implementation/NextGenerationInteractionModule.cs @@ -11,8 +11,8 @@ namespace mROA.Implementation { private const int BufferSize = ushort.MaxValue; private readonly Memory _buffer = new byte[BufferSize]; - private readonly List _messageBuffer = new(128); - private Task? _currentReceiving; + private readonly List _messageBuffer = new(128); + private Task? _currentReceiving; private ISerializationToolkit? _serialization; public int ConnectionId { get; set; } public Stream? BaseStream { get; set; } @@ -31,14 +31,14 @@ namespace mROA.Implementation } } - public Task GetNextMessageReceiving() + public Task GetNextMessageReceiving() { if (_currentReceiving != null) return _currentReceiving; _currentReceiving = Task.Run(async () => await GetNextMessage()); return _currentReceiving; } - public async Task PostMessage(NetworkMessage message) + public async Task PostMessage(NetworkMessageHeader messageHeader) { if (BaseStream == null) throw new NullReferenceException("BaseStream is null"); @@ -49,26 +49,26 @@ namespace mROA.Implementation // Console.WriteLine("Sending {0}", JsonSerializer.Serialize(message)); - var rawMessage = _serialization.Serialize(message); + var rawMessage = _serialization.Serialize(messageHeader); var header = BitConverter.GetBytes((ushort)rawMessage.Length).AsMemory(0, sizeof(ushort)); await BaseStream.WriteAsync(header); await BaseStream.WriteAsync(rawMessage); } - public void HandleMessage(NetworkMessage message) + public void HandleMessage(NetworkMessageHeader messageHeader) { - _messageBuffer.Remove(message); + _messageBuffer.Remove(messageHeader); } - public NetworkMessage[] UnhandledMessages => _messageBuffer.ToArray(); + public NetworkMessageHeader[] UnhandledMessages => _messageBuffer.ToArray(); - public NetworkMessage? FirstByFilter(Predicate predicate) + public NetworkMessageHeader? FirstByFilter(Predicate predicate) { return _messageBuffer.FirstOrDefault(m => predicate(m)); } - private async Task GetNextMessage() + private async Task GetNextMessage() { if (BaseStream == null) throw new NullReferenceException("BaseStream is null"); @@ -88,7 +88,7 @@ namespace mROA.Implementation // Console.WriteLine("Receiving {0}", Encoding.Default.GetString(_buffer[..len])); - var message = _serialization.Deserialize(localSpan.Span); + var message = _serialization.Deserialize(localSpan.Span); #if TRACE Console.WriteLine($"{DateTime.Now.TimeOfDay} Received Message {message.Id} - {message.SchemaId}"); TransmissionConfig.TotalTransmittedBytes += len; diff --git a/mROA/Implementation/RemoteObjectBase.cs b/mROA/Implementation/RemoteObjectBase.cs index a35e734..7f2be6f 100644 --- a/mROA/Implementation/RemoteObjectBase.cs +++ b/mROA/Implementation/RemoteObjectBase.cs @@ -56,24 +56,24 @@ namespace mROA.Implementation CommandId = methodId, ObjectId = _identifier, Parameters = parameters }; - await _representationModule.PostCallMessageAsync(request.Id, MessageType.CallRequest, request); + await _representationModule.PostCallMessageAsync(request.Id, EMessageType.CallRequest, request); var localTokenSource = new CancellationTokenSource(); var successResponse = _representationModule.GetMessageAsync>(request.Id, - MessageType.FinishedCommandExecution, + EMessageType.FinishedCommandExecution, localTokenSource.Token); var errorResponse = _representationModule.GetMessageAsync(requestId: request.Id, - MessageType.ExceptionCommandExecution, localTokenSource.Token); + EMessageType.ExceptionCommandExecution, localTokenSource.Token); cancellationToken.Register(async () => { #if TRACE Console.WriteLine("Cancelling task"); #endif - await _representationModule.PostCallMessageAsync(request.Id, MessageType.CancelRequest, + await _representationModule.PostCallMessageAsync(request.Id, EMessageType.CancelRequest, new CancelRequest { Id = request.Id @@ -103,24 +103,24 @@ namespace mROA.Implementation { CommandId = methodId, ObjectId = _identifier, Parameters = parameters }; - await _representationModule.PostCallMessageAsync(request.Id, MessageType.CallRequest, request); + await _representationModule.PostCallMessageAsync(request.Id, EMessageType.CallRequest, request); var localTokenSource = new CancellationTokenSource(); var successResponse = _representationModule.GetMessageAsync(request.Id, - MessageType.FinishedCommandExecution, + EMessageType.FinishedCommandExecution, localTokenSource.Token); var errorResponse = _representationModule.GetMessageAsync(requestId: request.Id, - MessageType.ExceptionCommandExecution, localTokenSource.Token); + EMessageType.ExceptionCommandExecution, localTokenSource.Token); cancellationToken.Register(async () => { #if TRACE Console.WriteLine("Cancelling task"); #endif - await _representationModule.PostCallMessageAsync(request.Id, MessageType.CancelRequest, + await _representationModule.PostCallMessageAsync(request.Id, EMessageType.CancelRequest, new CancelRequest { Id = request.Id diff --git a/mROA/Implementation/RepresentationModule.cs b/mROA/Implementation/RepresentationModule.cs index e10f9da..fce743a 100644 --- a/mROA/Implementation/RepresentationModule.cs +++ b/mROA/Implementation/RepresentationModule.cs @@ -28,7 +28,7 @@ namespace mROA.Implementation public int Id => (_interaction ?? throw new NullReferenceException("Interaction is not initialized")) .ConnectionId; - public async Task GetMessageAsync(Guid? requestId, MessageType? messageType, + public async Task GetMessageAsync(Guid? requestId, EMessageType? messageType, CancellationToken token = default) { if (_serialization == null) @@ -38,7 +38,7 @@ namespace mROA.Implementation return _serialization.Deserialize(rawMessage)!; } - public T GetMessage(Guid? requestId = null, MessageType? messageType = null) + public T GetMessage(Guid? requestId = null, EMessageType? messageType = null) { if (_serialization == null) throw new NullReferenceException("Serialization toolkit is not initialized"); @@ -47,7 +47,7 @@ namespace mROA.Implementation return _serialization.Deserialize(rawMessage)!; } - public async Task GetRawMessage(Guid? requestId = null, MessageType? messageType = null, + public async Task GetRawMessage(Guid? requestId = null, EMessageType? messageType = null, CancellationToken token = default) { if (_interaction == null) @@ -56,7 +56,7 @@ namespace mROA.Implementation var fromBuffer = _interaction.FirstByFilter(message => (requestId is null || message.Id == requestId) && - (messageType is null || message.SchemaId == messageType)); + (messageType is null || message.EMessageType == messageType)); if (fromBuffer == null) { @@ -64,7 +64,7 @@ namespace mROA.Implementation { var message = await _interaction.GetNextMessageReceiving(); if ((requestId is not null && message.Id != requestId) || - (messageType is not null && message.SchemaId != messageType)) + (messageType is not null && message.EMessageType != messageType)) continue; _interaction.HandleMessage(message); @@ -81,12 +81,12 @@ namespace mROA.Implementation return fromBuffer.Data; } - public async Task PostCallMessageAsync(Guid id, MessageType messageType, T payload) where T : notnull + public async Task PostCallMessageAsync(Guid id, EMessageType eMessageType, T payload) where T : notnull { - await PostCallMessageAsync(id, messageType, payload, typeof(T)); + await PostCallMessageAsync(id, eMessageType, payload, typeof(T)); } - public async Task PostCallMessageAsync(Guid id, MessageType messageType, object payload, Type payloadType) + public async Task PostCallMessageAsync(Guid id, EMessageType eMessageType, object payload, Type payloadType) { if (_interaction == null) throw new NullReferenceException("Interaction toolkit is not initialized"); @@ -97,18 +97,18 @@ namespace mROA.Implementation #endif var serialized = _serialization.Serialize(payload, payloadType); - await _interaction.PostMessage(new NetworkMessage - { Id = id, SchemaId = messageType, Data = serialized }); + await _interaction.PostMessage(new NetworkMessageHeader + { Id = id, EMessageType = eMessageType, Data = serialized }); } - public void PostCallMessage(Guid id, MessageType messageType, T payload) where T : notnull + public void PostCallMessage(Guid id, EMessageType eMessageType, T payload) where T : notnull { - PostCallMessageAsync(id, messageType, payload).GetAwaiter().GetResult(); + PostCallMessageAsync(id, eMessageType, payload).GetAwaiter().GetResult(); } - public void PostCallMessage(Guid id, MessageType messageType, object payload, Type payloadType) + public void PostCallMessage(Guid id, EMessageType eMessageType, object payload, Type payloadType) { - PostCallMessageAsync(id, messageType, payload, payloadType).GetAwaiter().GetResult(); + PostCallMessageAsync(id, eMessageType, payload, payloadType).GetAwaiter().GetResult(); } } } \ No newline at end of file