M src/PacketLogger/Models/Packets/DummyPacketProvider.cs => src/PacketLogger/Models/Packets/DummyPacketProvider.cs +3 -0
@@ 58,6 58,9 @@ public class DummyPacketProvider : IPacketProvider, IDisposable
}
/// <inheritdoc />
+ public bool Closed => false;
+
+ /// <inheritdoc />
public string Name { get; }
/// <inheritdoc />
M src/PacketLogger/Models/Packets/FilePacketProvider.cs => src/PacketLogger/Models/Packets/FilePacketProvider.cs +3 -0
@@ 45,6 45,9 @@ public class FilePacketProvider : IPacketProvider
public string DocumentTitle { get; set; } = string.Empty;
/// <inheritdoc />
+ public bool Closed => false;
+
+ /// <inheritdoc />
public string Name => Path.GetFileName(_fileName);
/// <inheritdoc />
M src/PacketLogger/Models/Packets/IPacketProvider.cs => src/PacketLogger/Models/Packets/IPacketProvider.cs +5 -0
@@ 23,6 23,11 @@ namespace PacketLogger.Models.Packets;
public interface IPacketProvider : INotifyPropertyChanged, IDisposable
{
/// <summary>
+ /// Gets whether the connection is closed.
+ /// </summary>
+ public bool Closed { get; }
+
+ /// <summary>
/// Gets the name.
/// </summary>
public string Name { get; }
M src/PacketLogger/Models/Titles/NumberedTitleGenerator.cs => src/PacketLogger/Models/Titles/NumberedTitleGenerator.cs +29 -29
@@ 18,7 18,7 @@ namespace PacketLogger.Models.Titles;
/// </summary>
public class NumberedTitleGenerator
{
- private readonly SemaphoreSlim _semaphore;
+ private readonly object _lock = new object();
private readonly ConcurrentDictionary<string, List<Title>> _titles;
/// <summary>
@@ 26,7 26,6 @@ public class NumberedTitleGenerator
/// </summary>
public NumberedTitleGenerator()
{
- _semaphore = new SemaphoreSlim(1, 1);
_titles = new ConcurrentDictionary<string, List<Title>>();
}
@@ 76,33 75,34 @@ public class NumberedTitleGenerator
private void HandleTitleChange(Title title, string newTitle)
{
- _semaphore.Wait();
- _titles.AddOrUpdate
- (
- title.CurrentTitle,
- _ => new List<Title>(),
- (_, u) =>
- {
- u.Remove(title);
- return u;
- }
- );
- UpdateNumbers(title.CurrentTitle);
-
- title.CurrentTitle = newTitle;
- _titles.TryAdd(newTitle, new List<Title>());
- _titles.AddOrUpdate
- (
- newTitle,
- _ => new List<Title>(),
- (_, u) =>
- {
- u.Add(title);
- return u;
- }
- );
- UpdateNumbers(title.CurrentTitle);
- _semaphore.Release();
+ lock (_lock)
+ {
+ _titles.AddOrUpdate
+ (
+ title.CurrentTitle,
+ _ => new List<Title>(),
+ (_, u) =>
+ {
+ u.Remove(title);
+ return u;
+ }
+ );
+ UpdateNumbers(title.CurrentTitle);
+
+ title.CurrentTitle = newTitle;
+ _titles.TryAdd(newTitle, new List<Title>());
+ _titles.AddOrUpdate
+ (
+ newTitle,
+ _ => new List<Title>(),
+ (_, u) =>
+ {
+ u.Add(title);
+ return u;
+ }
+ );
+ UpdateNumbers(title.CurrentTitle);
+ }
}
private void UpdateNumbers(string title)
M src/PacketLogger/ViewModels/DocumentViewModel.cs => src/PacketLogger/ViewModels/DocumentViewModel.cs +5 -2
@@ 313,14 313,17 @@ public class DocumentViewModel : Document, INotifyPropertyChanged, IDisposable
{
Loading = true;
NestedViewModel = new PacketSenderViewModel(provider);
+ _cleanUp?.Dispose();
+ _cleanUp = null;
+
_titleHandle?.Dispose();
_titleHandle = titleGenerator.AddTitle
(
title => Title = title,
provider
- .WhenAnyValue(x => x.DocumentTitle)
+ .WhenValueChanged(x => x.DocumentTitle)
.ObserveOn(RxApp.MainThreadScheduler)
- .Select(x => $"Sender - {provider.DocumentTitle}"),
+ .Select(x => "Sender - " + x),
provider.Name
);
Loaded = true;