using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Tango.Transport.Adapters { /// /// Experimental... /// /// public class MultiTransportAdapter : TransportAdapterBase { public class MultiTransportAdapterDataAvailableEventArgs : EventArgs { public ITransportAdapter Adapter { get; set; } public byte[] Data { get; set; } } public class MultiTransportAdapterStateChangedEventArgs : EventArgs { public ITransportAdapter Adapter { get; set; } public TransportComponentState State { get; set; } } public event EventHandler AdapterDataAvailable; public event EventHandler AdapterStateChangedAvailable; public ReadOnlyCollection Adapters { get; private set; } public MultiTransportAdapter() { Adapters = new ReadOnlyCollection(new List()); ComponentName = "Multi Transport Adapter"; } public override void Write(byte[] data, bool immidiate = false) { Adapters.ToList().ForEach(x => x.Write(data)); } public void Write(byte[] data, ITransportAdapter adapter) { adapter.Write(data); } public override async Task Connect() { foreach (var adapter in Adapters.ToList().Where(x => x.State != TransportComponentState.Connected)) { await adapter.Connect(); } } public override async Task Disconnect() { foreach (var adapter in Adapters.ToList()) { await adapter.Disconnect(); } } public override void Dispose() { foreach (var adapter in Adapters.ToList()) { adapter.Dispose(); } } public void AddAdapter(ITransportAdapter adapter) { List list = Adapters.ToList(); list.Add(adapter); Adapters = new ReadOnlyCollection(list); adapter.DataAvailable += Adapter_DataAvailable; adapter.StateChanged += Adapter_StateChanged; } public void RemoveAdapter(ITransportAdapter adapter) { List list = Adapters.ToList(); list.Remove(adapter); Adapters = new ReadOnlyCollection(list); adapter.DataAvailable -= Adapter_DataAvailable; adapter.StateChanged -= Adapter_StateChanged; } public void ClearAdapters() { foreach (var adapter in Adapters.ToList()) { adapter.DataAvailable -= Adapter_DataAvailable; adapter.StateChanged -= Adapter_StateChanged; } Adapters = new ReadOnlyCollection(new List()); } private void Adapter_StateChanged(object sender, TransportComponentState state) { AdapterStateChangedAvailable?.Invoke(this, new MultiTransportAdapterStateChangedEventArgs() { Adapter = sender as ITransportAdapter, State = state, }); } private void Adapter_DataAvailable(object sender, byte[] data) { OnDataAvailable(data); AdapterDataAvailable?.Invoke(this, new MultiTransportAdapterDataAvailableEventArgs() { Adapter = sender as ITransportAdapter, Data = data, }); } } }