Skip to content

Commit

Permalink
fix warning IDE1006
Browse files Browse the repository at this point in the history
  • Loading branch information
smdn committed Apr 3, 2024
1 parent 075b3d5 commit f7c7420
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 69 deletions.
1 change: 0 additions & 1 deletion src/Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ SPDX-License-Identifier: MIT

<!-- disables code style/code analysis warnings configured by Smdn.MSBuild.ProjectAssets.Common -->
<PropertyGroup>
<NoWarn>IDE1006;$(NoWarn)</NoWarn> <!-- IDE1006: 名前付けルール違反 -->
<NoWarn>CA1008;$(NoWarn)</NoWarn> <!-- CA1008: 提案された名前 'None' を伴う、値 0 を含む メンバーを追加します -->
<NoWarn>CA1031;$(NoWarn)</NoWarn> <!-- CA1031: 'Dispose' を変更してより具体的な許可された例外の種類をキャッチするか、例外を再スローしてください -->
<NoWarn>CA1063;$(NoWarn)</NoWarn> <!-- CA1063: Dispose(bool) のオーバーライド可能な実装を提供するか、型を sealed としてマークします。Dispose(false) を呼び出す場合は、ネイティブ リソースのみがクリーンアップされます。Dispose(true) を呼び出す場合には、マネージド リソースとネイティブ リソースの両方がクリーンアップされます。 -->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,28 +112,28 @@ IReadOnlyList<EchonetClassGroupSpecification> specs
/// <summary>
/// シングルトンイスタンス
/// </summary>
private static SpecificationMaster? _Instance;
private static SpecificationMaster? instance;

/// <summary>
/// インスタンス取得
/// </summary>
/// <returns></returns>
public static SpecificationMaster GetInstance()
{
if (_Instance is null) {
const string specificationMasterJsonFileName = "SpecificationMaster.json";
if (instance is null) {
const string SpecificationMasterJsonFileName = "SpecificationMaster.json";

using var stream = GetSpecificationMasterDataStream(specificationMasterJsonFileName);
using var stream = GetSpecificationMasterDataStream(SpecificationMasterJsonFileName);

_Instance = new(
instance = new(
JsonSerializer.Deserialize<SpecificationMasterJsonObject>(
stream,
JsonSerializerSourceGenerationContext.Default.SpecificationMasterJsonObject
) ?? throw new InvalidOperationException($"failed to deserialize {specificationMasterJsonFileName}")
) ?? throw new InvalidOperationException($"failed to deserialize {SpecificationMasterJsonFileName}")
);
}

return _Instance;
return instance;
}

private static readonly string SpecificationMasterDataLogicalRootName = "MasterData/";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,15 @@ partial class EchonetClient
{
/// <summary>
/// 送信するECHONET Lite フレームを書き込むバッファ。
/// <see cref="_echonetLiteHandler"/>によって送信する内容を書き込むために使用する。
/// <see cref="echonetLiteHandler"/>によって送信する内容を書き込むために使用する。
/// </summary>
private readonly ArrayBufferWriter<byte> _requestFrameBuffer = new(initialCapacity: 0x100);
private readonly ArrayBufferWriter<byte> requestFrameBuffer = new(initialCapacity: 0x100);

/// <summary>
/// ECHONET Lite フレームのリクエスト送信時の排他区間を定義するセマフォ。
/// <see cref="_requestFrameBuffer"/>への書き込み、および<see cref="_echonetLiteHandler"/>による送信を排他制御するために使用する。
/// <see cref="requestFrameBuffer"/>への書き込み、および<see cref="echonetLiteHandler"/>による送信を排他制御するために使用する。
/// </summary>
private readonly SemaphoreSlim _requestSemaphore = new(initialCount: 1, maxCount: 1);
private readonly SemaphoreSlim requestSemaphore = new(initialCount: 1, maxCount: 1);

/// <summary>
/// <see cref="IEchonetLiteHandler.Received"/>イベントにてECHONET Lite フレームを受信した場合に発生するイベント。
Expand Down Expand Up @@ -66,7 +66,7 @@ private void EchonetDataReceived(object? sender, (IPAddress address, ReadOnlyMem
// ECHONETLiteフレームではないため無視
return;

_logger?.LogTrace($"Echonet Lite Frame受信: address:{value.address}\r\n,{JsonSerializer.Serialize(frame, JsonSerializerSourceGenerationContext.Default.Frame)}");
logger?.LogTrace($"Echonet Lite Frame受信: address:{value.address}\r\n,{JsonSerializer.Serialize(frame, JsonSerializerSourceGenerationContext.Default.Frame)}");

FrameReceived?.Invoke(this, (value.address, frame));
}
Expand All @@ -86,14 +86,14 @@ private async ValueTask SendFrameAsync(IPAddress? address, Action<IBufferWriter<
{
ThrowIfDisposed();

await _requestSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
await requestSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);

try {
writeFrame(_requestFrameBuffer);
writeFrame(requestFrameBuffer);

if (_logger is not null && _logger.IsEnabled(LogLevel.Trace)) {
if (FrameSerializer.TryDeserialize(_requestFrameBuffer.WrittenSpan, out var frame)) {
_logger.LogTrace($"Echonet Lite Frame送信: address:{address}\r\n,{JsonSerializer.Serialize(frame, JsonSerializerSourceGenerationContext.Default.Frame)}");
if (logger is not null && logger.IsEnabled(LogLevel.Trace)) {
if (FrameSerializer.TryDeserialize(requestFrameBuffer.WrittenSpan, out var frame)) {
logger.LogTrace($"Echonet Lite Frame送信: address:{address}\r\n,{JsonSerializer.Serialize(frame, JsonSerializerSourceGenerationContext.Default.Frame)}");
}
#if DEBUG
else {
Expand All @@ -102,16 +102,16 @@ private async ValueTask SendFrameAsync(IPAddress? address, Action<IBufferWriter<
#endif
}

await _echonetLiteHandler.SendAsync(address, _requestFrameBuffer.WrittenMemory, cancellationToken).ConfigureAwait(false);
await echonetLiteHandler.SendAsync(address, requestFrameBuffer.WrittenMemory, cancellationToken).ConfigureAwait(false);
}
finally {
// reset written count to reuse the buffer for the next write
#if SYSTEM_BUFFERS_ARRAYBUFFERWRITER_RESETWRITTENCOUNT
_requestFrameBuffer.ResetWrittenCount();
requestFrameBuffer.ResetWrittenCount();
#else
_requestFrameBuffer.Clear();
requestFrameBuffer.Clear();
#endif
_requestSemaphore.Release();
requestSemaphore.Release();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -784,7 +784,7 @@ await SendFrameAsync(
/// <seealso cref="AcquirePropertyMapsAsync"/>
private async ValueTask HandleInstanceListNotificationReceivedAsync(EchonetNode sourceNode, ReadOnlyMemory<byte> edt)
{
_logger?.LogTrace("インスタンスリスト通知を受信しました");
logger?.LogTrace("インスタンスリスト通知を受信しました");

if (!PropertyContentSerializer.TryDeserializeInstanceListNotification(edt.Span, out var instanceList))
return; // XXX
Expand All @@ -808,13 +808,13 @@ private async ValueTask HandleInstanceListNotificationReceivedAsync(EchonetNode

foreach (var device in instances) {
if (!device.HasPropertyMapAcquired) {
_logger?.LogTrace($"{device.GetDebugString()} プロパティマップを読み取ります");
logger?.LogTrace($"{device.GetDebugString()} プロパティマップを読み取ります");
await AcquirePropertyMapsAsync(sourceNode, device).ConfigureAwait(false);
}
}

if (!sourceNode.NodeProfile.HasPropertyMapAcquired) {
_logger?.LogTrace($"{sourceNode.NodeProfile.GetDebugString()} プロパティマップを読み取ります");
logger?.LogTrace($"{sourceNode.NodeProfile.GetDebugString()} プロパティマップを読み取ります");
await AcquirePropertyMapsAsync(sourceNode, sourceNode.NodeProfile).ConfigureAwait(false);
}

Expand Down Expand Up @@ -852,17 +852,17 @@ private async ValueTask AcquirePropertyMapsAsync(EchonetNode sourceNode, Echonet
).ConfigureAwait(false);
}
catch (OperationCanceledException ex) when (ctsTimeout.Token.Equals(ex.CancellationToken)) {
_logger?.LogTrace($"{device.GetDebugString()} プロパティマップの読み取りがタイムアウトしました");
logger?.LogTrace($"{device.GetDebugString()} プロパティマップの読み取りがタイムアウトしました");
return;
}

// 不可応答は無視
if (!result) {
_logger?.LogTrace($"{device.GetDebugString()} プロパティマップの読み取りで不可応答が返答されました");
logger?.LogTrace($"{device.GetDebugString()} プロパティマップの読み取りで不可応答が返答されました");
return;
}

_logger?.LogTrace($"{device.GetDebugString()} プロパティマップの読み取りが成功しました");
logger?.LogTrace($"{device.GetDebugString()} プロパティマップの読み取りが成功しました");

var propertyCapabilityMap = new Dictionary<byte, PropertyCapability>(capacity: 16);

Expand Down Expand Up @@ -929,7 +929,7 @@ private async ValueTask AcquirePropertyMapsAsync(EchonetNode sourceNode, Echonet
)
);

if (_logger is not null) {
if (logger is not null) {
var sb = new StringBuilder();

sb.AppendLine("------");
Expand All @@ -940,7 +940,7 @@ private async ValueTask AcquirePropertyMapsAsync(EchonetNode sourceNode, Echonet

sb.AppendLine("------");

_logger.LogTrace(sb.ToString());
logger.LogTrace(sb.ToString());
}

device.HasPropertyMapAcquired = true;
Expand Down Expand Up @@ -1065,7 +1065,7 @@ private void HandleFrameReceived(object? sender, (IPAddress address, Frame frame

task?.ContinueWith((t) => {
if (t.Exception is not null) {
_logger?.LogTrace(t.Exception, "Exception");
logger?.LogTrace(t.Exception, "Exception");
}
});
}
Expand Down
32 changes: 16 additions & 16 deletions src/Smdn.Net.EchonetLite/Smdn.Net.EchonetLite/EchonetClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
namespace Smdn.Net.EchonetLite;

public partial class EchonetClient : IDisposable, IAsyncDisposable {
private readonly bool _shouldDisposeEchonetLiteHandler;
private IEchonetLiteHandler _echonetLiteHandler; // null if disposed
private readonly ILogger? _logger;
private readonly bool shouldDisposeEchonetLiteHandler;
private IEchonetLiteHandler echonetLiteHandler; // null if disposed
private readonly ILogger? logger;

/// <summary>
/// 現在の<see cref="EchonetClient"/>インスタンスが扱う自ノードを表す<see cref="SelfNode"/>。
Expand Down Expand Up @@ -58,10 +58,10 @@ public EchonetClient(
ILogger<EchonetClient>? logger
)
{
_logger = logger;
_shouldDisposeEchonetLiteHandler = shouldDisposeEchonetLiteHandler;
_echonetLiteHandler = echonetLiteHandler ?? throw new ArgumentNullException(nameof(echonetLiteHandler));
_echonetLiteHandler.Received += EchonetDataReceived;
this.logger = logger;
this.shouldDisposeEchonetLiteHandler = shouldDisposeEchonetLiteHandler;
this.echonetLiteHandler = echonetLiteHandler ?? throw new ArgumentNullException(nameof(echonetLiteHandler));
this.echonetLiteHandler.Received += EchonetDataReceived;
SelfNode = new(
address: nodeAddress ?? throw new ArgumentNullException(nameof(nodeAddress)),
nodeProfile: new(Profiles.NodeProfile, 0x01)
Expand Down Expand Up @@ -106,13 +106,13 @@ protected virtual void Dispose(bool disposing)
if (disposing) {
FrameReceived = null; // unsubscribe

if (_echonetLiteHandler is not null) {
_echonetLiteHandler.Received -= EchonetDataReceived;
if (echonetLiteHandler is not null) {
echonetLiteHandler.Received -= EchonetDataReceived;

if (_shouldDisposeEchonetLiteHandler && _echonetLiteHandler is IDisposable disposableEchonetLiteHandler)
if (shouldDisposeEchonetLiteHandler && echonetLiteHandler is IDisposable disposableEchonetLiteHandler)
disposableEchonetLiteHandler.Dispose();

_echonetLiteHandler = null!;
echonetLiteHandler = null!;
}
}
}
Expand All @@ -125,13 +125,13 @@ protected virtual async ValueTask DisposeAsyncCore()
{
FrameReceived = null; // unsubscribe

if (_echonetLiteHandler is not null) {
_echonetLiteHandler.Received -= EchonetDataReceived;
if (echonetLiteHandler is not null) {
echonetLiteHandler.Received -= EchonetDataReceived;

if (_shouldDisposeEchonetLiteHandler && _echonetLiteHandler is IAsyncDisposable disposableEchonetLiteHandler)
if (shouldDisposeEchonetLiteHandler && echonetLiteHandler is IAsyncDisposable disposableEchonetLiteHandler)
await disposableEchonetLiteHandler.DisposeAsync().ConfigureAwait(false);

_echonetLiteHandler = null!;
echonetLiteHandler = null!;
}
}

Expand All @@ -141,7 +141,7 @@ protected virtual async ValueTask DisposeAsyncCore()
/// <exception cref="ObjectDisposedException">現在のインスタンスはすでに破棄されています。</exception>
protected void ThrowIfDisposed()
{
if (_echonetLiteHandler is null)
if (echonetLiteHandler is null)
throw new ObjectDisposedException(GetType().FullName);
}
}
24 changes: 12 additions & 12 deletions src/Smdn.Net.EchonetLite/Smdn.Net.EchonetLite/EchonetProperty.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,17 +37,17 @@ public sealed class EchonetProperty {
/// </summary>
public bool CanAnnounceStatusChange { get; }

private ArrayBufferWriter<byte>? _value = null;
private ArrayBufferWriter<byte>? value = null;

/// <summary>
/// プロパティ値を表す<see cref="ReadOnlyMemory{Byte}"/>を取得します。
/// </summary>
public ReadOnlyMemory<byte> ValueMemory => _value is null ? ReadOnlyMemory<byte>.Empty : _value.WrittenMemory;
public ReadOnlyMemory<byte> ValueMemory => value is null ? ReadOnlyMemory<byte>.Empty : value.WrittenMemory;

/// <summary>
/// プロパティ値を表す<see cref="ReadOnlySpan{Byte}"/>を取得します。
/// </summary>
public ReadOnlySpan<byte> ValueSpan => _value is null ? ReadOnlySpan<byte>.Empty : _value.WrittenSpan;
public ReadOnlySpan<byte> ValueSpan => value is null ? ReadOnlySpan<byte>.Empty : value.WrittenSpan;

/// <summary>
/// プロパティ値に変更があった場合に発生するイベント。
Expand Down Expand Up @@ -148,32 +148,32 @@ private void WriteValue(Action<IBufferWriter<byte>> write, int newValueSize)
try {
var oldValueLength = 0;

if (_value is null) {
if (value is null) {
var initialCapacity = 0 < newValueSize ? newValueSize : 8; // TODO: best initial capacity

_value = new(initialCapacity);
value = new(initialCapacity);
}
else {
oldValueLength = _value.WrittenSpan.Length;
oldValueLength = value.WrittenSpan.Length;

oldValue = ArrayPool<byte>.Shared.Rent(oldValueLength);

_value.WrittenSpan.CopyTo(oldValue.AsSpan(0, oldValueLength));
value.WrittenSpan.CopyTo(oldValue.AsSpan(0, oldValueLength));

#if SYSTEM_BUFFERS_ARRAYBUFFERWRITER_RESETWRITTENCOUNT
_value.ResetWrittenCount();
value.ResetWrittenCount();
#else
_value.Clear();
value.Clear();
#endif
}

write(_value);
write(value);

if (valueChangedHandlers is not null) {
// 値が新規に設定される場合、以前の値から変更がある場合はValueChangedイベントを起こす
if (oldValue is null || !oldValue.AsSpan(0, oldValueLength).SequenceEqual(_value.WrittenSpan)) {
if (oldValue is null || !oldValue.AsSpan(0, oldValueLength).SequenceEqual(value.WrittenSpan)) {
var oldValueMemory = oldValue is null ? ReadOnlyMemory<byte>.Empty : oldValue.AsMemory(0, oldValueLength);
var newValueMemory = _value.WrittenMemory;
var newValueMemory = value.WrittenMemory;

valueChangedHandlers.Invoke(this, (oldValueMemory, newValueMemory));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,22 @@ namespace Smdn.Net.EchonetLite;

public class UdpEchonetLiteHandler : IEchonetLiteHandler, IDisposable {
private readonly UdpClient receiveUdpClient;
private readonly ILogger _logger;
private readonly ILogger logger;
private const int DefaultUdpPort = 3610;

public UdpEchonetLiteHandler(ILogger<UdpEchonetLiteHandler> logger)
{
var selfAddresses = NetworkInterface.GetAllNetworkInterfaces().SelectMany(ni => ni.GetIPProperties().UnicastAddresses.Select(ua => ua.Address));

_logger = logger;
this.logger = logger;

try {
receiveUdpClient = new UdpClient(DefaultUdpPort) {
EnableBroadcast = true
};
}
catch (Exception ex) {
_logger.LogDebug(ex, "Exception");
this.logger.LogDebug(ex, "Exception");
throw;
}

Expand All @@ -47,7 +47,7 @@ public UdpEchonetLiteHandler(ILogger<UdpEchonetLiteHandler> logger)
continue;
}
_logger.LogDebug($"UDP受信:{receivedResults.RemoteEndPoint.Address} {BitConverter.ToString(receivedResults.Buffer)}");
this.logger.LogDebug($"UDP受信:{receivedResults.RemoteEndPoint.Address} {BitConverter.ToString(receivedResults.Buffer)}");
Received?.Invoke(this, (receivedResults.RemoteEndPoint.Address, receivedResults.Buffer.AsMemory()));
}
Expand All @@ -56,7 +56,7 @@ public UdpEchonetLiteHandler(ILogger<UdpEchonetLiteHandler> logger)
// 握りつぶす
}
catch (Exception ex) {
_logger.LogDebug(ex, "Exception");
this.logger.LogDebug(ex, "Exception");
}
});
}
Expand All @@ -65,13 +65,13 @@ public UdpEchonetLiteHandler(ILogger<UdpEchonetLiteHandler> logger)

public void Dispose()
{
_logger.LogDebug("Dispose");
logger.LogDebug("Dispose");

try {
receiveUdpClient?.Close();
}
catch (Exception ex) {
_logger.LogDebug(ex, "Exception");
logger.LogDebug(ex, "Exception");
}
}

Expand All @@ -82,12 +82,12 @@ public async ValueTask SendAsync(IPAddress? address, ReadOnlyMemory<byte> data,
: new IPEndPoint(address, DefaultUdpPort);

#if SYSTEM_CONVERT_TOHEXSTRING
_logger.LogDebug($"UDP送信:{remote.Address} {Convert.ToHexString(data.Span)}");
logger.LogDebug($"UDP送信:{remote.Address} {Convert.ToHexString(data.Span)}");
#else
if (MemoryMarshal.TryGetArray(data, out var segment))
_logger.LogDebug($"UDP送信:{remote.Address} {BitConverter.ToString(segment.Array!, segment.Offset, segment.Count)}");
logger.LogDebug($"UDP送信:{remote.Address} {BitConverter.ToString(segment.Array!, segment.Offset, segment.Count)}");
else
_logger.LogDebug($"UDP送信:{remote.Address} {BitConverter.ToString(data.ToArray())}");
logger.LogDebug($"UDP送信:{remote.Address} {BitConverter.ToString(data.ToArray())}");
#endif

var sendUdpClient = new UdpClient() {
Expand Down

0 comments on commit f7c7420

Please sign in to comment.