From 614c0d8e9fb8844a419eec2cd1619d49e7a810c8 Mon Sep 17 00:00:00 2001 From: jaybz Date: Sun, 25 Apr 2021 08:29:00 +0800 Subject: [PATCH] Add exit handler which fires when Touch Portal exits with the plugin still running --- TouchPortalApi/Interfaces/IMessageProcessor.cs | 2 ++ TouchPortalApi/MessageProcessor.cs | 5 +++++ TouchPortalApi/TPClient.cs | 3 +++ 3 files changed, 10 insertions(+) diff --git a/TouchPortalApi/Interfaces/IMessageProcessor.cs b/TouchPortalApi/Interfaces/IMessageProcessor.cs index 1bc94fe..992229c 100644 --- a/TouchPortalApi/Interfaces/IMessageProcessor.cs +++ b/TouchPortalApi/Interfaces/IMessageProcessor.cs @@ -7,12 +7,14 @@ namespace TouchPortalApi.Interfaces { public delegate void ListChangeEventHandler(string actionId, string listId, string instanceId, string value); public delegate void CloseEventHandler(); public delegate void ConnectEventHandler(); + public delegate void ExitHandler(); public interface IMessageProcessor { event ActionEventHandler OnActionEvent; event ListChangeEventHandler OnListChangeEventHandler; event CloseEventHandler OnCloseEventHandler; event ConnectEventHandler OnConnectEventHandler; + event ExitHandler OnExitHandler; Task Listen(); Task TryPairAsync(); diff --git a/TouchPortalApi/MessageProcessor.cs b/TouchPortalApi/MessageProcessor.cs index e23d755..a5e32dd 100644 --- a/TouchPortalApi/MessageProcessor.cs +++ b/TouchPortalApi/MessageProcessor.cs @@ -2,6 +2,7 @@ using Newtonsoft.Json; using System; using System.Buffers; +using System.Net.Sockets; using System.Threading; using System.Threading.Tasks; using TouchPortalApi.Configuration; @@ -28,6 +29,7 @@ public class MessageProcessor : IMessageProcessor { public event ListChangeEventHandler OnListChangeEventHandler; public event CloseEventHandler OnCloseEventHandler; public event ConnectEventHandler OnConnectEventHandler; + public event ExitHandler OnExitHandler; #endregion @@ -61,6 +63,9 @@ public async Task Listen() { while (!_cancellationToken.IsCancellationRequested) { try { await _tPClient.ProcessPipes(); + } catch (SocketException) { + OnExitHandler?.Invoke(); + return; } catch (Exception ex) { Console.WriteLine(ex); } diff --git a/TouchPortalApi/TPClient.cs b/TouchPortalApi/TPClient.cs index ed1e099..1333f2f 100644 --- a/TouchPortalApi/TPClient.cs +++ b/TouchPortalApi/TPClient.cs @@ -5,6 +5,7 @@ using System.Buffers; using System.IO.Pipelines; using System.Net; +using System.Net.Sockets; using System.Runtime.CompilerServices; using System.Text; using System.Threading; @@ -85,6 +86,8 @@ public async Task ProcessPipes() { Task reading = ReadPipeAsync(pipe.Reader); await Task.WhenAll(reading, writing).ConfigureAwait(false); + if(!_tpsocket.Connected) + throw new SocketException(); } ///