From 96a212a42bff735f7a543fe609ee9ac5e420f336 Mon Sep 17 00:00:00 2001 From: Eugene Wang <8755753+soukoku@users.noreply.github.com> Date: Sun, 9 Apr 2023 13:19:16 -0400 Subject: [PATCH] Renamed datatransferred event. --- ...edEventArgs.cs => TransferredEventArgs.cs} | 24 +++++++++++--- src/NTwain/TwainAppSession.PropEvents.cs | 20 ++++++----- src/NTwain/TwainAppSession.Xfers.cs | 33 ++++++++++++------- src/NTwain/TwainAppSession.cs | 10 +++--- 4 files changed, 57 insertions(+), 30 deletions(-) rename src/NTwain/{DataTransferredEventArgs.cs => TransferredEventArgs.cs} (58%) diff --git a/src/NTwain/DataTransferredEventArgs.cs b/src/NTwain/TransferredEventArgs.cs similarity index 58% rename from src/NTwain/DataTransferredEventArgs.cs rename to src/NTwain/TransferredEventArgs.cs index 4e0af55..2d6c2bc 100644 --- a/src/NTwain/DataTransferredEventArgs.cs +++ b/src/NTwain/TransferredEventArgs.cs @@ -6,27 +6,30 @@ namespace NTwain // TODO: maybe a 2-level "dispose" with end of event being 1 // and manual dispose 2 for perf if this is not good enough. - public class DataTransferredEventArgs : EventArgs + public class TransferredEventArgs : EventArgs { - public DataTransferredEventArgs(TW_AUDIOINFO info, TW_SETUPFILEXFER fileInfo) + public TransferredEventArgs(TW_AUDIOINFO info, TW_SETUPFILEXFER fileInfo) { AudioInfo = info; FileInfo = fileInfo; } - public DataTransferredEventArgs(TW_AUDIOINFO info, BufferedData data) + public TransferredEventArgs(TW_AUDIOINFO info, BufferedData data) { AudioInfo = info; _data = data; } - public DataTransferredEventArgs(TW_IMAGEINFO info, TW_SETUPFILEXFER? fileInfo, BufferedData data) + public TransferredEventArgs(TwainAppSession twain, TW_IMAGEINFO info, TW_SETUPFILEXFER? fileInfo, BufferedData data) { ImageInfo = info; FileInfo = fileInfo; IsImage = true; _data = data; + _twain = twain; } + TwainAppSession? _twain; + /// /// Whether transferred data is an image or audio. /// @@ -57,5 +60,18 @@ namespace NTwain /// public TW_AUDIOINFO AudioInfo { get; } + /// + /// Gets the ext image info. Use any utility methods on it + /// to read the data. Remember to call + /// when done. + /// + /// Container to query. Can be created with + /// + public STS GetExtendedImageInfo(ref TW_EXTIMAGEINFO container) + { + if (_twain == null) return default; + return _twain.GetExtendedImageInfo(ref container); + } + } } \ No newline at end of file diff --git a/src/NTwain/TwainAppSession.PropEvents.cs b/src/NTwain/TwainAppSession.PropEvents.cs index c6770e3..ac1257d 100644 --- a/src/NTwain/TwainAppSession.PropEvents.cs +++ b/src/NTwain/TwainAppSession.PropEvents.cs @@ -15,10 +15,6 @@ namespace NTwain public TW_IDENTITY_LEGACY AppIdentity { get => _appIdentity; - internal set - { - _appIdentity = value; - } } TW_IDENTITY_LEGACY _appIdentity; @@ -28,7 +24,7 @@ namespace NTwain public TW_IDENTITY_LEGACY CurrentSource { get => _currentDS; - internal set + protected set { _currentDS = value; try @@ -56,16 +52,22 @@ namespace NTwain public STATE State { get => _state; - internal set + protected set { if (_state != value) { _state = value; + if (StateChanged != null) + { + _uiThreadMarshaller.Invoke(() => + { try { - StateChanged?.Invoke(this, value); // TODO: should care about thread + StateChanged.Invoke(this, value); } catch { } + }); + } } } } @@ -126,7 +128,6 @@ namespace NTwain /// /// Fires when changes. - /// This is not guaranteed to be raised on the UI thread. /// public event TwainEventDelegate? StateChanged; @@ -163,7 +164,8 @@ namespace NTwain /// /// Fires when transferred data is available for app to use. + /// This is NOT raised on the UI thread for reasons. /// - public event TwainEventDelegate? DataTransferred; + public event TwainEventDelegate? Transferred; } } diff --git a/src/NTwain/TwainAppSession.Xfers.cs b/src/NTwain/TwainAppSession.Xfers.cs index e8c2c0f..8e66544 100644 --- a/src/NTwain/TwainAppSession.Xfers.cs +++ b/src/NTwain/TwainAppSession.Xfers.cs @@ -67,14 +67,17 @@ namespace NTwain do { var readyArgs = new TransferReadyEventArgs(pending.Count, (TWEJ)pending.EOJ); + if (TransferReady != null) + { _uiThreadMarshaller.Invoke(() => { try { - TransferReady?.Invoke(this, readyArgs); + TransferReady.Invoke(this, readyArgs); } catch { } // don't let consumer kill the loop if they have exception }); + } if (readyArgs.Cancel == CancelType.EndNow || _closeDsRequested) { @@ -108,7 +111,7 @@ namespace NTwain try { if (readyArgs.Cancel != CancelType.SkipCurrent && - DataTransferred != null) + Transferred != null) { // transfer normally and only if someone's listening // to DataTransferred event @@ -146,13 +149,19 @@ namespace NTwain } catch (Exception ex) { + if (TransferError != null) + { + _uiThreadMarshaller.Invoke(() => + { try { TransferError?.Invoke(this, new TransferErrorEventArgs(ex)); } catch { } + }); } } + } } while (sts.RC == TWRC.SUCCESS && pending.Count != 0); } @@ -229,8 +238,8 @@ namespace NTwain try { DGAudio.AudioInfo.Get(ref _appIdentity, ref _currentDS, out TW_AUDIOINFO info); - var args = new DataTransferredEventArgs(info, fileSetup); - DataTransferred?.Invoke(this, args); + var args = new TransferredEventArgs(info, fileSetup); + Transferred?.Invoke(this, args); } catch { } ; @@ -263,8 +272,8 @@ namespace NTwain try { DGAudio.AudioInfo.Get(ref _appIdentity, ref _currentDS, out TW_AUDIOINFO info); - var args = new DataTransferredEventArgs(info, data); - DataTransferred?.Invoke(this, args); + var args = new TransferredEventArgs(info, data); + Transferred?.Invoke(this, args); } catch { } finally @@ -429,8 +438,8 @@ namespace NTwain { DGImage.ImageInfo.Get(ref _appIdentity, ref _currentDS, out TW_IMAGEINFO info); // ToArray bypasses the XferMemPool but I guess this will have to do for now - var args = new DataTransferredEventArgs(info, fileSetup, new BufferedData { Buffer = outStream.ToArray(), Length = (int)outStream.Length }); - DataTransferred?.Invoke(this, args); + var args = new TransferredEventArgs(this, info, fileSetup, new BufferedData { Buffer = outStream.ToArray(), Length = (int)outStream.Length }); + Transferred?.Invoke(this, args); } catch { } @@ -457,8 +466,8 @@ namespace NTwain try { DGImage.ImageInfo.Get(ref _appIdentity, ref _currentDS, out TW_IMAGEINFO info); - var args = new DataTransferredEventArgs(info, fileSetup, default); - DataTransferred?.Invoke(this, args); + var args = new TransferredEventArgs(this, info, fileSetup, default); + Transferred?.Invoke(this, args); } catch { } @@ -503,8 +512,8 @@ namespace NTwain try { DGImage.ImageInfo.Get(ref _appIdentity, ref _currentDS, out TW_IMAGEINFO info); - var args = new DataTransferredEventArgs(info, null, data); - DataTransferred?.Invoke(this, args); + var args = new TransferredEventArgs(this, info, null, data); + Transferred?.Invoke(this, args); } catch { } finally diff --git a/src/NTwain/TwainAppSession.cs b/src/NTwain/TwainAppSession.cs index bcf6e9e..5d0ed9a 100644 --- a/src/NTwain/TwainAppSession.cs +++ b/src/NTwain/TwainAppSession.cs @@ -133,23 +133,23 @@ namespace NTwain }); break; case MSG.DEVICEEVENT: - if (DGControl.DeviceEvent.Get(ref _appIdentity, ref _currentDS, out TW_DEVICEEVENT de) == TWRC.SUCCESS) + if (DeviceEvent != null && DGControl.DeviceEvent.Get(ref _appIdentity, ref _currentDS, out TW_DEVICEEVENT de) == TWRC.SUCCESS) { _uiThreadMarshaller.BeginInvoke(() => { try { - DeviceEvent?.Invoke(this, de); + DeviceEvent.Invoke(this, de); } catch { } }); } break; case MSG.XFERREADY: - _uiThreadMarshaller.Invoke(() => - { + //_uiThreadMarshaller.Invoke(() => + //{ State = STATE.S6; - }); + //}); EnterTransferRoutine(); break; }