using System;
using System.Collections.Generic;
using ZeroDDS.Cond;
using ZeroDDS.Core;
using ZeroDDS.Domain;
using ZeroDDS.Pub;
using ZeroDDS.Sub;
using ZeroDDS.SubCond;
using ZeroDDS.Topic;
namespace ZeroDDS;
public sealed class DomainParticipantFactory
{
private static readonly DomainParticipantFactory _instance = new();
private DomainParticipantFactory() { }
public static DomainParticipantFactory Instance => _instance;
public DomainParticipant CreateParticipant(uint domainId) =>
ZeroDDS.Domain.DomainParticipantFactory.CreateParticipant(domainId);
public DomainParticipant CreateParticipant(uint domainId,
ZeroDDS.Qos.DomainParticipantQos qos) =>
ZeroDDS.Domain.DomainParticipantFactory.CreateParticipant(domainId, qos);
}
public static class FluentExtensions
{
public static Topic<byte[]> CreateBytesTopic(this DomainParticipant dp, string name) =>
new Topic<byte[]>(dp, name, new ByteSeqTraits());
public static Publisher CreatePublisher(this DomainParticipant dp) => new Publisher(dp);
public static Subscriber CreateSubscriber(this DomainParticipant dp) => new Subscriber(dp);
public static BytesWriter CreateBytesWriter(this Publisher pub, Topic<byte[]> topic) =>
new BytesWriter(new DataWriter<byte[]>(pub, topic));
public static BytesReader CreateBytesReader(this Subscriber sub, Topic<byte[]> topic) =>
new BytesReader(new DataReader<byte[]>(sub, topic));
}
public sealed class BytesWriter : IDisposable
{
private readonly DataWriter<byte[]> _inner;
internal BytesWriter(DataWriter<byte[]> inner) => _inner = inner;
public DataWriter<byte[]> Writer => _inner;
public void Write(byte[] payload) => _inner.Write(payload);
public void WaitForMatchedSubscription(int count, TimeSpan timeout) =>
_inner.WaitForMatched(count, timeout.ToDuration());
public void WaitForAcks(TimeSpan timeout) => _inner.WaitForAcks(timeout.ToDuration());
public void Dispose() => _inner.Dispose();
}
public sealed class BytesReader : IDisposable
{
private readonly DataReader<byte[]> _inner;
internal BytesReader(DataReader<byte[]> inner) => _inner = inner;
public DataReader<byte[]> Reader => _inner;
public void WaitForMatchedPublication(int count, TimeSpan timeout) =>
_inner.WaitForMatched(count, timeout.ToDuration());
public bool WaitForData(TimeSpan timeout) => _inner.WaitForData(timeout);
public IEnumerable<byte[]> Take(int maxSamples = 0)
{
var samples = _inner.Take(maxSamples);
var result = new List<byte[]>(samples.Count);
foreach (var s in samples)
{
if (s.Info.ValidData && s.Data is not null)
result.Add(s.Data);
}
return result;
}
public void Dispose() => _inner.Dispose();
}
public static class TimeSpanBridge
{
public static Duration ToDuration(this TimeSpan ts)
{
if (ts == System.Threading.Timeout.InfiniteTimeSpan || ts.TotalMilliseconds < 0)
return Duration.Infinite;
long ms = (long)ts.TotalMilliseconds;
return Duration.FromMillis(ms);
}
}