From c61f45970d133d6973bfa51d03c9ff4ff5b4e19b Mon Sep 17 00:00:00 2001 From: Rutherther Date: Wed, 15 Feb 2023 17:18:24 +0100 Subject: [PATCH] fix: make sender title change correctly --- .../Models/Packets/DummyPacketProvider.cs | 3 + .../Models/Packets/FilePacketProvider.cs | 3 + .../Models/Packets/IPacketProvider.cs | 5 ++ .../Models/Titles/NumberedTitleGenerator.cs | 58 +++++++++---------- .../ViewModels/DocumentViewModel.cs | 7 ++- 5 files changed, 45 insertions(+), 31 deletions(-) diff --git a/src/PacketLogger/Models/Packets/DummyPacketProvider.cs b/src/PacketLogger/Models/Packets/DummyPacketProvider.cs index 2467207..83ba57e 100644 --- a/src/PacketLogger/Models/Packets/DummyPacketProvider.cs +++ b/src/PacketLogger/Models/Packets/DummyPacketProvider.cs @@ -57,6 +57,9 @@ public class DummyPacketProvider : IPacketProvider, IDisposable set { } } + /// + public bool Closed => false; + /// public string Name { get; } diff --git a/src/PacketLogger/Models/Packets/FilePacketProvider.cs b/src/PacketLogger/Models/Packets/FilePacketProvider.cs index c8c38f9..2bbe1d6 100644 --- a/src/PacketLogger/Models/Packets/FilePacketProvider.cs +++ b/src/PacketLogger/Models/Packets/FilePacketProvider.cs @@ -44,6 +44,9 @@ public class FilePacketProvider : IPacketProvider /// public string DocumentTitle { get; set; } = string.Empty; + /// + public bool Closed => false; + /// public string Name => Path.GetFileName(_fileName); diff --git a/src/PacketLogger/Models/Packets/IPacketProvider.cs b/src/PacketLogger/Models/Packets/IPacketProvider.cs index 2424d73..5ffa1b8 100644 --- a/src/PacketLogger/Models/Packets/IPacketProvider.cs +++ b/src/PacketLogger/Models/Packets/IPacketProvider.cs @@ -22,6 +22,11 @@ namespace PacketLogger.Models.Packets; /// public interface IPacketProvider : INotifyPropertyChanged, IDisposable { + /// + /// Gets whether the connection is closed. + /// + public bool Closed { get; } + /// /// Gets the name. /// diff --git a/src/PacketLogger/Models/Titles/NumberedTitleGenerator.cs b/src/PacketLogger/Models/Titles/NumberedTitleGenerator.cs index f800051..aebe663 100644 --- a/src/PacketLogger/Models/Titles/NumberedTitleGenerator.cs +++ b/src/PacketLogger/Models/Titles/NumberedTitleGenerator.cs @@ -18,7 +18,7 @@ namespace PacketLogger.Models.Titles; /// public class NumberedTitleGenerator { - private readonly SemaphoreSlim _semaphore; + private readonly object _lock = new object(); private readonly ConcurrentDictionary> _titles; /// @@ -26,7 +26,6 @@ public class NumberedTitleGenerator /// public NumberedTitleGenerator() { - _semaphore = new SemaphoreSlim(1, 1); _titles = new ConcurrentDictionary>(); } @@ -76,33 +75,34 @@ public class NumberedTitleGenerator private void HandleTitleChange(Title title, string newTitle) { - _semaphore.Wait(); - _titles.AddOrUpdate - ( - title.CurrentTitle, - _ => new List(), - (_, 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) diff --git a/src/PacketLogger/ViewModels/DocumentViewModel.cs b/src/PacketLogger/ViewModels/DocumentViewModel.cs index 33089a8..b9da2bf 100644 --- a/src/PacketLogger/ViewModels/DocumentViewModel.cs +++ b/src/PacketLogger/ViewModels/DocumentViewModel.cs @@ -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; -- 2.48.1