From 4bc82efc8b2fedbb52dd51b6eb5ac3abd22fe421 Mon Sep 17 00:00:00 2001 From: Ben Olden-Cooligan Date: Sat, 3 Aug 2024 08:53:39 -0700 Subject: [PATCH] Add a better error message for worker crashes --- .../Lang/Resources/SdkResources.Designer.cs | 18 +++++ NAPS2.Sdk/Lang/Resources/SdkResources.resx | 6 ++ NAPS2.Sdk/Platform/ISystemCompat.cs | 2 + NAPS2.Sdk/Platform/LinuxSystemCompat.cs | 2 + NAPS2.Sdk/Platform/MacSystemCompat.cs | 2 + NAPS2.Sdk/Platform/WindowsSystemCompat.cs | 2 + .../Remoting/Worker/WorkerServiceAdapter.cs | 74 +++++++++++++++---- 7 files changed, 92 insertions(+), 14 deletions(-) diff --git a/NAPS2.Sdk/Lang/Resources/SdkResources.Designer.cs b/NAPS2.Sdk/Lang/Resources/SdkResources.Designer.cs index 3bffb711ec..071f08ec62 100644 --- a/NAPS2.Sdk/Lang/Resources/SdkResources.Designer.cs +++ b/NAPS2.Sdk/Lang/Resources/SdkResources.Designer.cs @@ -256,5 +256,23 @@ internal static string Version { return ResourceManager.GetString("Version", resourceCulture); } } + + /// + /// Looks up a localized string similar to The worker process crashed.. + /// + internal static string WorkerCrash { + get { + return ResourceManager.GetString("WorkerCrash", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The worker process crashed. Check the Windows event viewer.. + /// + internal static string WorkerCrashWindows { + get { + return ResourceManager.GetString("WorkerCrashWindows", resourceCulture); + } + } } } diff --git a/NAPS2.Sdk/Lang/Resources/SdkResources.resx b/NAPS2.Sdk/Lang/Resources/SdkResources.resx index 70923afe7e..319d040fd5 100644 --- a/NAPS2.Sdk/Lang/Resources/SdkResources.resx +++ b/NAPS2.Sdk/Lang/Resources/SdkResources.resx @@ -183,4 +183,10 @@ The OCR operation timed out. + + The worker process crashed. + + + The worker process crashed. Check the Windows event viewer. + \ No newline at end of file diff --git a/NAPS2.Sdk/Platform/ISystemCompat.cs b/NAPS2.Sdk/Platform/ISystemCompat.cs index 734efb9863..46bacd355c 100644 --- a/NAPS2.Sdk/Platform/ISystemCompat.cs +++ b/NAPS2.Sdk/Platform/ISystemCompat.cs @@ -34,6 +34,8 @@ internal interface ISystemCompat bool SupportsWinX86Worker { get; } + string WorkerCrashMessage { get; } + string[] ExeSearchPaths { get; } string[] LibrarySearchPaths { get; } diff --git a/NAPS2.Sdk/Platform/LinuxSystemCompat.cs b/NAPS2.Sdk/Platform/LinuxSystemCompat.cs index 9b15cd527e..c92b1acbbe 100644 --- a/NAPS2.Sdk/Platform/LinuxSystemCompat.cs +++ b/NAPS2.Sdk/Platform/LinuxSystemCompat.cs @@ -40,6 +40,8 @@ internal class LinuxSystemCompat : ISystemCompat public bool SupportsWinX86Worker => false; + public string WorkerCrashMessage => SdkResources.WorkerCrash; + public string[] ExeSearchPaths => LibrarySearchPaths; public string[] LibrarySearchPaths => new[] diff --git a/NAPS2.Sdk/Platform/MacSystemCompat.cs b/NAPS2.Sdk/Platform/MacSystemCompat.cs index 4ee7bcd14f..ef31229ced 100644 --- a/NAPS2.Sdk/Platform/MacSystemCompat.cs +++ b/NAPS2.Sdk/Platform/MacSystemCompat.cs @@ -40,6 +40,8 @@ internal class MacSystemCompat : ISystemCompat public bool SupportsWinX86Worker => false; + public string WorkerCrashMessage => SdkResources.WorkerCrash; + public string[] ExeSearchPaths => LibrarySearchPaths; public string[] LibrarySearchPaths diff --git a/NAPS2.Sdk/Platform/WindowsSystemCompat.cs b/NAPS2.Sdk/Platform/WindowsSystemCompat.cs index 41131db881..cf883c2e72 100644 --- a/NAPS2.Sdk/Platform/WindowsSystemCompat.cs +++ b/NAPS2.Sdk/Platform/WindowsSystemCompat.cs @@ -37,6 +37,8 @@ internal abstract class WindowsSystemCompat : ISystemCompat public bool SupportsWinX86Worker => true; + public string WorkerCrashMessage => SdkResources.WorkerCrashWindows; + public abstract string[] ExeSearchPaths { get; } public abstract string[] LibrarySearchPaths { get; } diff --git a/NAPS2.Sdk/Remoting/Worker/WorkerServiceAdapter.cs b/NAPS2.Sdk/Remoting/Worker/WorkerServiceAdapter.cs index 3e2b954a09..716f6126c3 100644 --- a/NAPS2.Sdk/Remoting/Worker/WorkerServiceAdapter.cs +++ b/NAPS2.Sdk/Remoting/Worker/WorkerServiceAdapter.cs @@ -3,6 +3,7 @@ using NAPS2.ImportExport.Email; using NAPS2.ImportExport.Email.Mapi; using NAPS2.Scan; +using NAPS2.Scan.Exceptions; using NAPS2.Scan.Internal; using NAPS2.Scan.Internal.Twain; using NAPS2.Scan.Internal.Wia; @@ -60,6 +61,10 @@ public async Task GetDevices(ScanOptions options, CancellationToken cancelToken, } catch (RpcException ex) { + if (ex.StatusCode == StatusCode.Unavailable) + { + throw new ScanDriverUnknownException(PlatformCompat.System.WorkerCrashMessage, ex); + } if (ex.Status.StatusCode != StatusCode.Cancelled) { throw; @@ -69,10 +74,21 @@ public async Task GetDevices(ScanOptions options, CancellationToken cancelToken, public async Task GetCaps(ScanOptions options, CancellationToken cancelToken) { - var req = new GetCapsRequest { OptionsXml = options.ToXml() }; - var resp = await _client.GetCapsAsync(req, cancellationToken: cancelToken); - RemotingHelper.HandleErrors(resp.Error); - return resp.ScanCapsXml.FromXml(); + try + { + var req = new GetCapsRequest { OptionsXml = options.ToXml() }; + var resp = await _client.GetCapsAsync(req, cancellationToken: cancelToken); + RemotingHelper.HandleErrors(resp.Error); + return resp.ScanCapsXml.FromXml(); + } + catch (RpcException ex) + { + if (ex.StatusCode == StatusCode.Unavailable) + { + throw new ScanDriverUnknownException(PlatformCompat.System.WorkerCrashMessage, ex); + } + throw; + } } public async Task Scan(ScanningContext scanningContext, ScanOptions options, CancellationToken cancelToken, @@ -107,7 +123,11 @@ public async Task Scan(ScanningContext scanningContext, ScanOptions options, Can } catch (RpcException ex) { - if (ex.Status.StatusCode != StatusCode.Cancelled) + if (ex.StatusCode == StatusCode.Unavailable) + { + throw new ScanDriverUnknownException(PlatformCompat.System.WorkerCrashMessage, ex); + } + if (ex.StatusCode != StatusCode.Cancelled) { throw; } @@ -194,7 +214,11 @@ public async Task TwainScan(ScanOptions options, CancellationToken cancelToken, } catch (RpcException ex) { - if (ex.Status.StatusCode != StatusCode.Cancelled) + if (ex.StatusCode == StatusCode.Unavailable) + { + throw new ScanDriverUnknownException(PlatformCompat.System.WorkerCrashMessage, ex); + } + if (ex.StatusCode != StatusCode.Cancelled) { throw; } @@ -203,18 +227,40 @@ public async Task TwainScan(ScanOptions options, CancellationToken cancelToken, public async Task> TwainGetDeviceList(ScanOptions options) { - var req = new GetDeviceListRequest { OptionsXml = options.ToXml() }; - var resp = await _client.TwainGetDeviceListAsync(req); - RemotingHelper.HandleErrors(resp.Error); - return resp.DeviceListXml.FromXml>(); + try + { + var req = new GetDeviceListRequest { OptionsXml = options.ToXml() }; + var resp = await _client.TwainGetDeviceListAsync(req); + RemotingHelper.HandleErrors(resp.Error); + return resp.DeviceListXml.FromXml>(); + } + catch (RpcException ex) + { + if (ex.StatusCode == StatusCode.Unavailable) + { + throw new ScanDriverUnknownException(PlatformCompat.System.WorkerCrashMessage, ex); + } + throw; + } } public async Task TwainGetCaps(ScanOptions options) { - var req = new GetCapsRequest { OptionsXml = options.ToXml() }; - var resp = await _client.TwainGetCapsAsync(req); - RemotingHelper.HandleErrors(resp.Error); - return resp.ScanCapsXml.FromXml(); + try + { + var req = new GetCapsRequest { OptionsXml = options.ToXml() }; + var resp = await _client.TwainGetCapsAsync(req); + RemotingHelper.HandleErrors(resp.Error); + return resp.ScanCapsXml.FromXml(); + } + catch (RpcException ex) + { + if (ex.StatusCode == StatusCode.Unavailable) + { + throw new ScanDriverUnknownException(PlatformCompat.System.WorkerCrashMessage, ex); + } + throw; + } } public ProcessedImage ImportPostProcess(ScanningContext scanningContext, ProcessedImage img, int? thumbnailSize,