diff --git a/Example.Backend/PrinterFactory.cs b/Example.Backend/PrinterFactory.cs index 59e12cd..10ac15c 100644 --- a/Example.Backend/PrinterFactory.cs +++ b/Example.Backend/PrinterFactory.cs @@ -18,8 +18,8 @@ public class PrinterFactory : IPrinterFactory public void Register(SharedObject printer) { - Console.WriteLine("Registered printer"); _printers.Add(printer.Value); + Console.WriteLine("Registered printer"); } public SharedObject GetPrinterByName(string printerName) @@ -28,6 +28,11 @@ public class PrinterFactory : IPrinterFactory return new SharedObject(_printers.Find(i => i.GetName() == printerName)!); } + public SharedObject GetFirstPrinter() + { + return new SharedObject(_printers.First()); + } + public string[] CollectAllNames() { Console.WriteLine("Collecting all printers"); diff --git a/Example.Frontend/Program.cs b/Example.Frontend/Program.cs index 64733c6..64d2872 100644 --- a/Example.Frontend/Program.cs +++ b/Example.Frontend/Program.cs @@ -39,11 +39,15 @@ var printer = factory.Create("Test"); var name = printer.Value.GetName(); Console.WriteLine("Printer name : {0}", name); -Console.WriteLine("Registered printer"); factory.Register(new SharedObject(new ClientBasedPrinter())); +Console.WriteLine("Registered printer"); + +var registred = factory.GetFirstPrinter(); +Console.WriteLine(registred.Value); Console.WriteLine("Collecting all printers"); var names = factory.CollectAllNames(); +Console.WriteLine(names); Console.ReadLine(); // var page = await printer.Value.Print("Test Page", new CancellationToken()); diff --git a/Example.Shared/IPrinterFactory.cs b/Example.Shared/IPrinterFactory.cs index 36b686e..5800dd2 100644 --- a/Example.Shared/IPrinterFactory.cs +++ b/Example.Shared/IPrinterFactory.cs @@ -11,6 +11,7 @@ public interface IPrinterFactory SharedObject Create(string printerName); void Register(SharedObject printer); SharedObject GetPrinterByName(string printerName); + SharedObject GetFirstPrinter(); string[] CollectAllNames(); } \ No newline at end of file diff --git a/mROA/Abstract/ISerialisationModule.cs b/mROA/Abstract/ISerialisationModule.cs index 24105cd..0e06e21 100644 --- a/mROA/Abstract/ISerialisationModule.cs +++ b/mROA/Abstract/ISerialisationModule.cs @@ -20,8 +20,12 @@ public interface ISerialisationModule : IInjectableModule public interface IRepresentationModule : IInjectableModule { int Id { get; } - Task GetMessage(Guid? requestId = null, MessageType? messageType = null); + Task GetMessageAsync(Guid? requestId = null, MessageType? messageType = null); + T GetMessage(Guid? requestId = null, MessageType? messageType = null); Task GetRawMessage(Guid? requestId = null, MessageType? messageType = null); - Task PostCallMessage(Guid id, MessageType messageType, T payload); - Task PostCallMessage(Guid id, MessageType messageType, object payload, Type payloadType); + + Task PostCallMessageAsync(Guid id, MessageType messageType, T payload); + Task PostCallMessageAsync(Guid id, MessageType messageType, object payload, Type payloadType); + void PostCallMessage(Guid id, MessageType messageType, T payload); + void PostCallMessage(Guid id, MessageType messageType, object payload, Type payloadType); } \ No newline at end of file diff --git a/mROA/Implementation/Backend/ConnectionHub.cs b/mROA/Implementation/Backend/ConnectionHub.cs index 1a93416..e2c0c18 100644 --- a/mROA/Implementation/Backend/ConnectionHub.cs +++ b/mROA/Implementation/Backend/ConnectionHub.cs @@ -12,6 +12,7 @@ public class ConnectionHub : IConnectionHub if (_serializationToolkit is null) throw new NullReferenceException("Serialization toolkit is null"); + _connections.Add(interaction.ConnectionId, interaction); var module = new RepresentationModule(); module.Inject(_serializationToolkit); module.Inject(interaction); diff --git a/mROA/Implementation/Frontend/RequestExtractor.cs b/mROA/Implementation/Frontend/RequestExtractor.cs index 6c52060..64620f5 100644 --- a/mROA/Implementation/Frontend/RequestExtractor.cs +++ b/mROA/Implementation/Frontend/RequestExtractor.cs @@ -1,5 +1,6 @@ using mROA.Abstract; using mROA.Implementation.Backend; +// ReSharper disable MethodHasAsyncOverload namespace mROA.Implementation.Frontend; @@ -46,6 +47,8 @@ public class RequestExtractor : IRequestExtractor if (_methodRepository == null) throw new NullReferenceException("Method repository is null."); + await Task.Yield(); + var multiClientOwnershipRepository = TransmissionConfig.OwnershipRepository as MultiClientOwnershipRepository; @@ -55,8 +58,8 @@ public class RequestExtractor : IRequestExtractor { while (true) { - var request = - await _representationModule!.GetMessage(messageType: MessageType.CallRequest); + var request = + _representationModule!.GetMessage(messageType: MessageType.CallRequest); if (request.Parameter is not null) { @@ -72,7 +75,7 @@ public class RequestExtractor : IRequestExtractor ? MessageType.FinishedCommandExecution : MessageType.ExceptionCommandExecution; - await _representationModule.PostCallMessage(request.CallRequestId, resultType, result); + _representationModule.PostCallMessage(request.CallRequestId, resultType, result, result.GetType()); } } catch diff --git a/mROA/Implementation/RemoteObjectBase.cs b/mROA/Implementation/RemoteObjectBase.cs index 00c7129..286d3bc 100644 --- a/mROA/Implementation/RemoteObjectBase.cs +++ b/mROA/Implementation/RemoteObjectBase.cs @@ -20,13 +20,13 @@ public abstract class RemoteObjectBase { var request = new DefaultCallRequest { CommandId = methodId, ObjectId = _id, Parameter = parameter, ParameterType = parameter?.GetType() }; - await _representationModule.PostCallMessage(request.CallRequestId, MessageType.CallRequest, request); + await _representationModule.PostCallMessageAsync(request.CallRequestId, MessageType.CallRequest, request); var successResponse = - _representationModule.GetMessage>( + _representationModule.GetMessageAsync>( messageType: MessageType.FinishedCommandExecution, requestId: request.CallRequestId); var errorResponse = - _representationModule.GetMessage( + _representationModule.GetMessageAsync( messageType: MessageType.ExceptionCommandExecution, requestId: request.CallRequestId); Task.WaitAny(successResponse, errorResponse); @@ -40,13 +40,13 @@ public abstract class RemoteObjectBase { var request = new DefaultCallRequest { CommandId = methodId, ObjectId = _id, Parameter = parameter, ParameterType = parameter?.GetType() }; - await _representationModule.PostCallMessage(request.CallRequestId, MessageType.CallRequest, request); + await _representationModule.PostCallMessageAsync(request.CallRequestId, MessageType.CallRequest, request); var successResponse = - _representationModule.GetMessage( + _representationModule.GetMessageAsync( messageType: MessageType.FinishedCommandExecution, requestId: request.CallRequestId); var errorResponse = - _representationModule.GetMessage( + _representationModule.GetMessageAsync( messageType: MessageType.ExceptionCommandExecution, requestId: request.CallRequestId); Task.WaitAny(successResponse, errorResponse); diff --git a/mROA/Implementation/RepresentationModule.cs b/mROA/Implementation/RepresentationModule.cs index ee69974..a8a95f5 100644 --- a/mROA/Implementation/RepresentationModule.cs +++ b/mROA/Implementation/RepresentationModule.cs @@ -22,11 +22,16 @@ public class RepresentationModule : IRepresentationModule public int Id => _interaction.ConnectionId; - public async Task GetMessage(Guid? requestId, MessageType? messageType) + public async Task GetMessageAsync(Guid? requestId, MessageType? messageType) { return _serialization.Deserialize(await GetRawMessage(requestId, messageType))!; } + public T GetMessage(Guid? requestId = null, MessageType? messageType = null) + { + return _serialization.Deserialize(GetRawMessage(requestId, messageType).GetAwaiter().GetResult())!; + } + public async Task GetRawMessage(Guid? requestId = null, MessageType? messageType = null) { while (true) @@ -38,14 +43,24 @@ public class RepresentationModule : IRepresentationModule } } - public async Task PostCallMessage(Guid id, MessageType messageType, T payload) + public async Task PostCallMessageAsync(Guid id, MessageType messageType, T payload) { - await PostCallMessage(id, messageType, payload, typeof(T)); + await PostCallMessageAsync(id, messageType, payload, typeof(T)); } - public async Task PostCallMessage(Guid id, MessageType messageType, object payload, Type payloadType) + public async Task PostCallMessageAsync(Guid id, MessageType messageType, object payload, Type payloadType) { await _interaction.PostMessage(new NetworkMessage { Id = id, SchemaId = messageType, Data = _serialization.Serialize(payload, payloadType) }); } + + public void PostCallMessage(Guid id, MessageType messageType, T payload) + { + PostCallMessageAsync(id, messageType, payload).GetAwaiter().GetResult(); + } + + public void PostCallMessage(Guid id, MessageType messageType, object payload, Type payloadType) + { + PostCallMessageAsync(id, messageType, payload, payloadType).GetAwaiter().GetResult(); + } } \ No newline at end of file diff --git a/mROA/Implementation/SharedObject.cs b/mROA/Implementation/SharedObject.cs index c91ce50..e39d614 100644 --- a/mROA/Implementation/SharedObject.cs +++ b/mROA/Implementation/SharedObject.cs @@ -40,7 +40,7 @@ public class SharedObject where T : notnull { if (_contextId != -2) return _contextId; - + _contextId = TransmissionConfig.RealContextRepository!.GetObjectIndex(Value); return _contextId; } @@ -68,8 +68,8 @@ public class SharedObject where T : notnull _ownerId = ro.OwnerId; _contextId = ro.Id; } - - _ownerId = TransmissionConfig.OwnershipRepository!.GetHostOwnershipId(); + else + _ownerId = TransmissionConfig.OwnershipRepository!.GetHostOwnershipId(); } public static implicit operator T(SharedObject value) => value.Value;