2023-02-16 12:57:06 +00:00
|
|
|
using System.Text;
|
|
|
|
using InnovEnergy.Lib.Protocols.DBus.Protocol.DataTypes;
|
|
|
|
using InnovEnergy.Lib.Protocols.DBus.Protocol.Header;
|
|
|
|
using static InnovEnergy.Lib.Protocols.DBus.Protocol.Header.MessageType;
|
|
|
|
|
|
|
|
namespace InnovEnergy.Lib.Protocols.DBus.Daemon;
|
|
|
|
|
|
|
|
public interface IMatchRule
|
|
|
|
{
|
|
|
|
MessageType? Type { get; }
|
|
|
|
String? Interface { get; }
|
|
|
|
String? Member { get; }
|
|
|
|
ObjectPath? Path { get; }
|
|
|
|
ObjectPath? PathNamespace { get; }
|
|
|
|
String? Sender { get; }
|
|
|
|
String? Destination { get; }
|
|
|
|
Boolean Eavesdrop { get; }
|
|
|
|
|
|
|
|
// TODO: argN, argNpath, arg0namespace
|
|
|
|
}
|
|
|
|
|
|
|
|
public record MatchRule : IMatchRule
|
|
|
|
{
|
2023-06-27 11:14:17 +00:00
|
|
|
public MessageType? Type { get; init; }
|
|
|
|
public String? Interface { get; init; }
|
|
|
|
public String? Member { get; init; }
|
|
|
|
public ObjectPath? Path { get; init; }
|
|
|
|
public ObjectPath? PathNamespace { get; init; }
|
|
|
|
public String? Sender { get; init; }
|
|
|
|
public String? Destination { get; init; }
|
2023-02-16 12:57:06 +00:00
|
|
|
public Boolean Eavesdrop { get; init; } = false;
|
|
|
|
|
|
|
|
public override String ToString() => this.Rule();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public record SignalMatchRule : IMatchRule
|
|
|
|
{
|
|
|
|
public MessageType? Type => Signal;
|
|
|
|
public String? Interface { get; init; }
|
|
|
|
public String? Member { get; init; }
|
|
|
|
public ObjectPath? Path { get; init; }
|
|
|
|
public ObjectPath? PathNamespace { get; init; }
|
|
|
|
public String? Sender { get; init; }
|
|
|
|
public String? Destination => null;
|
|
|
|
public Boolean Eavesdrop => false;
|
|
|
|
|
|
|
|
public override String ToString() => this.Rule();
|
|
|
|
}
|
|
|
|
|
|
|
|
// public record MethodCallMatchRule : IMatchRule
|
|
|
|
// {
|
|
|
|
// public MessageType? Type => MethodCall;
|
|
|
|
// public String? Interface { get; init; } = null;
|
|
|
|
// public String? Member { get; init; } = null;
|
|
|
|
// public ObjectPath? Path { get; init; } = null;
|
|
|
|
// public ObjectPath? PathNamespace { get; init; } = null;
|
|
|
|
// public String? Destination => null;
|
|
|
|
// public String? Sender => null;
|
|
|
|
// public Boolean Eavesdrop => false;
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// public record MethodReturnMatchRule : IMatchRule
|
|
|
|
// {
|
|
|
|
// public MessageType? Type => MethodReturn;
|
|
|
|
// public String? Interface { get; init; } = null;
|
|
|
|
// public String? Member { get; init; } = null;
|
|
|
|
// public ObjectPath? Path { get; init; } = null;
|
|
|
|
// public ObjectPath? PathNamespace => null;
|
|
|
|
// public String? Destination => null;
|
|
|
|
// public String? Sender => null;
|
|
|
|
// public Boolean Eavesdrop => false;
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
internal static class MatchRuleExtensions
|
|
|
|
{
|
|
|
|
public static String Rule(this IMatchRule rule)
|
|
|
|
{
|
|
|
|
var sb = new StringBuilder();
|
|
|
|
|
|
|
|
Append("type" , MessageType(rule.Type));
|
|
|
|
Append("interface" , rule.Interface);
|
|
|
|
Append("member" , rule.Member);
|
|
|
|
Append("path" , rule.Path?.Path);
|
|
|
|
Append("sender" , rule.Sender);
|
|
|
|
Append("destination" , rule.Destination);
|
|
|
|
Append("path_namespace", rule.PathNamespace?.Path);
|
|
|
|
Append("eavesdrop" , rule.Eavesdrop ? "true" : null);
|
|
|
|
|
|
|
|
return sb.ToString();
|
|
|
|
|
|
|
|
void Append(String key, Object? value)
|
|
|
|
{
|
|
|
|
if (value is null) return;
|
|
|
|
|
|
|
|
if (sb.Length != 0)
|
|
|
|
sb.Append(',');
|
|
|
|
|
|
|
|
sb.Append(key);
|
|
|
|
sb.Append("='");
|
|
|
|
sb.Append(value.ToString()?.Replace(@"\", @"\\").Replace(@"'", @"\'"));
|
|
|
|
sb.Append('\'');
|
|
|
|
}
|
|
|
|
|
|
|
|
String? MessageType(MessageType? messageType) => messageType switch
|
|
|
|
{
|
|
|
|
Signal => "signal",
|
|
|
|
MethodCall => "method_call",
|
|
|
|
MethodReturn => "method_return",
|
|
|
|
Error => "error",
|
|
|
|
null => null,
|
|
|
|
_ => throw new ArgumentOutOfRangeException(nameof(messageType), messageType, null)
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|