From a0c09d1afe5e631d915f3a77e87556beed57c231 Mon Sep 17 00:00:00 2001 From: Sinan Date: Mon, 24 Sep 2018 12:41:54 +0200 Subject: [PATCH 3/4] Add factory singleton for participitants --- rsb-cil-test/Program.cs | 20 +++++---- rsb-cil/Rsb/Factory.cs | 117 ++++++++++++++++++++++++++++++++++++++++++++++++ rsb-cil/rsb-cil.csproj | 1 + 3 files changed, 129 insertions(+), 9 deletions(-) create mode 100644 rsb-cil/Rsb/Factory.cs diff --git a/rsb-cil-test/Program.cs b/rsb-cil-test/Program.cs index 1c5f39d..6d0f0a6 100644 --- a/rsb-cil-test/Program.cs +++ b/rsb-cil-test/Program.cs @@ -12,7 +12,7 @@ namespace rsbciltest { class MainClass { - static readonly byte[] host = new byte[] { 127, 0, 0, 1}; + static readonly byte[] ip = new byte[] { 127, 0, 0, 1}; static readonly int port = 30010; public static void PrintEvent(Event theEvent) @@ -48,11 +48,11 @@ namespace rsbciltest new Tuple(typeof(JointAngles), new ProtocolBufferConverter(JointAngles.Descriptor)) }); - var listener = new Listener(new InPushConnector(new BusClientConnection(host, port), new Scope("/"), inConverters)); + var listener = new Listener(new InPushConnector(new BusClientConnection(ip, port), new Scope("/"), inConverters)); listener.EventReceived += new NewEventHandler(PrintEvent); listener.Activate(); - var informer = new Informer("/test/narf", new OutConnector(new BusClientConnection(host, port), + var informer = new Informer("/test/narf", new OutConnector(new BusClientConnection(ip, port), outConverters)); Console.WriteLine(informer.Scope); informer.Activate(); @@ -74,15 +74,17 @@ namespace rsbciltest listener.Deactivate(); - Console.WriteLine("\nConverter test:"); + Console.WriteLine("\nRepository test with factory:"); - DefaultConverterRepository.Instance.addConverter(new ProtocolBufferConverter(JointAngles.Descriptor)); + Factory.Instance.Hostname = "localhost"; + Factory.Instance.Port = port; - Informer repoInformer = new Informer("/test/repo", new OutConnector(new BusClientConnection(host, port), DefaultConverterRepository.Instance.SerializationConverterSelector)); - Listener repoListener = new Listener(new InPushConnector(new BusClientConnection(host, port), new Scope("/"), DefaultConverterRepository.Instance.DeserializationConverterSelector)); + DefaultConverterRepository.Instance.addConverter(new ProtocolBufferConverter(JointAngles.Descriptor)); - repoListener.EventReceived += (e) => - { + Informer repoInformer = Factory.Instance.createInformer("/test/repo"); + Listener repoListener = Factory.Instance.createListener("/"); + + repoListener.EventReceived += (e) => { Console.WriteLine("Event: {0}\nData: {1}", e, e.Data); }; repoListener.Activate(); diff --git a/rsb-cil/Rsb/Factory.cs b/rsb-cil/Rsb/Factory.cs new file mode 100644 index 0000000..43edae6 --- /dev/null +++ b/rsb-cil/Rsb/Factory.cs @@ -0,0 +1,117 @@ + + +using Rsb.Transport.Socket; +using Rsb.Converter; + +using System; +using System.Net; +using System.Linq; +using System.Net.Sockets; +using Rsb.Patterns; + +namespace Rsb +{ + public class Factory + { + private static readonly Factory instance = new Factory(); + + private byte[] ip = { 127, 0, 0, 1 }; + private string hostname = "localhost"; + private int port = 30010; + + private IPEndPoint endPoint; + + public string Hostname { + get { return hostname; } + set { + endPoint = null; + hostname = value; + // query all ipv4 addresses of the ip + var addresses = Dns.GetHostAddresses(value); + var ipv4addresses = (from ipv4 in addresses where ipv4.AddressFamily == AddressFamily.InterNetwork select ipv4); + // take first ipv4 address + if (ipv4addresses.Count() != 0) + { + ip = ipv4addresses.First().GetAddressBytes(); + } + // otherwise take first address at all... + else { + ip = addresses[0].GetAddressBytes(); + } + } + } + + public byte[] Ip { + get { return ip; } + set + { + endPoint = null; + ip = value; + hostname = "unknown"; + } + } + + public int Port { + get { return port; } + set { + endPoint = null; + port = value; + } + } + + // Explicit static constructor to tell C# compiler + // not to mark type as beforefieldinit + static Factory() + { + } + + private Factory() + { + } + + public static Factory Instance + { + get + { + return instance; + } + } + + private void CheckEndPoint() { + if (endPoint == null) + { + endPoint = new IPEndPoint(new IPAddress(ip), port); + } + } + + public Informer CreateInformer(Scope scope) { + CheckEndPoint(); + + return new Informer(scope, + new OutConnector( + new BusClientConnection(endPoint), + DefaultConverterRepository.Instance.SerializationConverterSelector)); + } + + public Informer CreateInformer(string scope) { + return CreateInformer(new Scope(scope)); + } + + public Listener CreateListener(Scope scope) + { + CheckEndPoint(); + + return new Listener( + new InPushConnector( + new BusClientConnection(endPoint), + scope, + DefaultConverterRepository.Instance.DeserializationConverterSelector + )); + } + + public Listener CreateListener(string scope) { + return CreateListener(new Scope(scope)); + } + + } +} diff --git a/rsb-cil/rsb-cil.csproj b/rsb-cil/rsb-cil.csproj index 4b191fb..618a864 100644 --- a/rsb-cil/rsb-cil.csproj +++ b/rsb-cil/rsb-cil.csproj @@ -51,6 +51,7 @@ + -- 2.14.2.windows.1