From e3dfa8f4dd45db5e77aa701157435bc122ce82c3 Mon Sep 17 00:00:00 2001 From: Eugene Wang <8755753+soukoku@users.noreply.github.com> Date: Sat, 15 Feb 2025 18:39:13 -0500 Subject: [PATCH] Add method to set filexfer options on xferready event. --- src/Directory.Build.props | 2 +- src/NTwain/TransferReadyEventArgs.cs | 19 +++- src/NTwain/TwainAppSession.PropEvents.cs | 127 +++++++++++------------ src/NTwain/TwainAppSession.Xfers.cs | 13 ++- 4 files changed, 91 insertions(+), 70 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 652e517..b017de9 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -2,7 +2,7 @@ 4.0.0.0 - alpha.5 + alpha.6 4.0.0.0 diff --git a/src/NTwain/TransferReadyEventArgs.cs b/src/NTwain/TransferReadyEventArgs.cs index b7b4120..9902c05 100644 --- a/src/NTwain/TransferReadyEventArgs.cs +++ b/src/NTwain/TransferReadyEventArgs.cs @@ -8,11 +8,11 @@ namespace NTwain /// public class TransferReadyEventArgs : EventArgs { - public TransferReadyEventArgs(TWSX imgXferMech, TWSX audXferMech, int pendingCount, TWEJ endOfJobFlag) + public TransferReadyEventArgs(TwainAppSession twain, TWSX imgXferMech, TWSX audXferMech, int pendingCount, TWEJ endOfJobFlag) { + _twain = twain; ImgXferMech = imgXferMech; AudXferMech = audXferMech; - //_twain = twain; PendingCount = pendingCount; EndOfJobFlag = endOfJobFlag; } @@ -43,9 +43,20 @@ namespace NTwain /// public int PendingCount { get; private set; } - //TW_IMAGEINFO? _imgInfo; - //private readonly TwainAppSession _twain; + private readonly TwainAppSession _twain; + /// + /// If the transfer mech is file-related, + /// setup the file transfer options here. + /// + /// + /// + public STS SetupFileTransfer(ref TW_SETUPFILEXFER fileXfer) + { + return _twain.SetFileXfer(ref fileXfer); + } + + //TW_IMAGEINFO? _imgInfo; ///// ///// Gets the tentative image information for the current transfer if applicable. ///// This may differ from the final image depending on the transfer mode used (mostly when doing mem xfer). diff --git a/src/NTwain/TwainAppSession.PropEvents.cs b/src/NTwain/TwainAppSession.PropEvents.cs index bd7eb1f..dc2f17e 100644 --- a/src/NTwain/TwainAppSession.PropEvents.cs +++ b/src/NTwain/TwainAppSession.PropEvents.cs @@ -3,45 +3,45 @@ using NTwain.Triplets; using System; using System.Runtime.InteropServices; -namespace NTwain -{ - // this file contains property and event definitions +namespace NTwain; - partial class TwainAppSession - { +// this file contains property and event definitions + +partial class TwainAppSession +{ /// /// Gets the app identity. /// public TW_IDENTITY_LEGACY AppIdentity { - get => _appIdentity; + get => _appIdentity; } - TW_IDENTITY_LEGACY _appIdentity; + internal TW_IDENTITY_LEGACY _appIdentity; /// /// Gets the current (opened) data source. /// public TW_IDENTITY_LEGACY CurrentSource { - get => _currentDS; - protected set - { - _currentDS = value; - try + get => _currentDS; + protected set { - CurrentSourceChanged?.Invoke(this, value); + _currentDS = value; + try + { + CurrentSourceChanged?.Invoke(this, value); + } + catch { } } - catch { } - } } - TW_IDENTITY_LEGACY _currentDS; + internal TW_IDENTITY_LEGACY _currentDS; /// /// Gets/sets the default data source. /// public TW_IDENTITY_LEGACY DefaultSource { - get => _defaultDS; + get => _defaultDS; } TW_IDENTITY_LEGACY _defaultDS; @@ -51,19 +51,19 @@ namespace NTwain /// public STATE State { - get => _state; - protected set - { - if (_state != value) + get => _state; + protected set { - _state = value; - try - { - StateChanged?.Invoke(this, value); - } - catch { } + if (_state != value) + { + _state = value; + try + { + StateChanged?.Invoke(this, value); + } + catch { } + } } - } } STATE _state = STATE.S1; @@ -74,49 +74,49 @@ namespace NTwain /// public byte[]? CustomDsData { - get - { - var rc = DGControl.CustomDsData.Get(ref _appIdentity, ref _currentDS, out TW_CUSTOMDSDATA data); - if (rc == TWRC.SUCCESS) + get { - if (data.hData != IntPtr.Zero && data.InfoLength > 0) - { + var rc = DGControl.CustomDsData.Get(ref _appIdentity, ref _currentDS, out TW_CUSTOMDSDATA data); + if (rc == TWRC.SUCCESS) + { + if (data.hData != IntPtr.Zero && data.InfoLength > 0) + { + try + { + var lockedPtr = Lock(data.hData); + var bytes = new byte[data.InfoLength]; + Marshal.Copy(lockedPtr, bytes, 0, bytes.Length); + } + finally + { + Unlock(data.hData); + Free(data.hData); + } + } + //return Array.Empty(); + } + return null; + } + set + { + if (value == null || value.Length == 0) return; + + TW_CUSTOMDSDATA data = default; + data.InfoLength = (uint)value.Length; + data.hData = Alloc(data.InfoLength); try { - var lockedPtr = Lock(data.hData); - var bytes = new byte[data.InfoLength]; - Marshal.Copy(lockedPtr, bytes, 0, bytes.Length); + var lockedPtr = Lock(data.hData); + Marshal.Copy(value, 0, lockedPtr, value.Length); + Unlock(data.hData); + var rc = DGControl.CustomDsData.Set(ref _appIdentity, ref _currentDS, ref data); } finally { - Unlock(data.hData); - Free(data.hData); + // should be freed already if no error but just in case + if (data.hData != IntPtr.Zero) Free(data.hData); } - } - //return Array.Empty(); } - return null; - } - set - { - if (value == null || value.Length == 0) return; - - TW_CUSTOMDSDATA data = default; - data.InfoLength = (uint)value.Length; - data.hData = Alloc(data.InfoLength); - try - { - var lockedPtr = Lock(data.hData); - Marshal.Copy(value, 0, lockedPtr, value.Length); - Unlock(data.hData); - var rc = DGControl.CustomDsData.Set(ref _appIdentity, ref _currentDS, ref data); - } - finally - { - // should be freed already if no error but just in case - if (data.hData != IntPtr.Zero) Free(data.hData); - } - } } @@ -166,5 +166,4 @@ namespace NTwain /// This is NOT raised on the UI thread for reasons. /// public event TwainEventDelegate? Transferred; - } } diff --git a/src/NTwain/TwainAppSession.Xfers.cs b/src/NTwain/TwainAppSession.Xfers.cs index 05437f4..c19e99c 100644 --- a/src/NTwain/TwainAppSession.Xfers.cs +++ b/src/NTwain/TwainAppSession.Xfers.cs @@ -23,6 +23,17 @@ namespace NTwain return WrapInSTS(DGImage.ExtImageInfo.Get(ref _appIdentity, ref _currentDS, ref container)); } + /// + /// Can only be called in state 6, so it's here and only exposed + /// in transfer ready event. + /// + /// + /// + internal STS SetFileXfer(ref TW_SETUPFILEXFER settings) + { + return WrapInSTS(DGControl.SetupFileXfer.Set(ref _appIdentity, ref _currentDS, ref settings)); + } + /// /// Start the transfer loop. @@ -66,7 +77,7 @@ namespace NTwain { do { - var readyArgs = new TransferReadyEventArgs(imgXferMech, audXferMech, pending.Count, (TWEJ)pending.EOJ); + var readyArgs = new TransferReadyEventArgs(this, imgXferMech, audXferMech, pending.Count, (TWEJ)pending.EOJ); try { TransferReady?.Invoke(this, readyArgs);