diff --git a/src/NTwain/DataTransferredEventArgs.cs b/src/NTwain/DataTransferredEventArgs.cs index 42dbbba..bf2da74 100644 --- a/src/NTwain/DataTransferredEventArgs.cs +++ b/src/NTwain/DataTransferredEventArgs.cs @@ -11,6 +11,14 @@ namespace NTwain readonly TwainAppSession _twain; readonly bool _isImage; + + internal DataTransferredEventArgs(TwainAppSession twain, bool isImage, TW_SETUPFILEXFER xfer) + { + _twain = twain; + _isImage = isImage; + File = xfer; + } + /// /// Ctor for array data; /// @@ -33,6 +41,11 @@ namespace NTwain /// public byte[]? Data { get; } + /// + /// The file info if this was a file transfer. + /// + public TW_SETUPFILEXFER? File { get; } + /// /// Gets the final image information if transfer was an image. diff --git a/src/NTwain/Triplets/ControlDATs/SetupFileXfer.cs b/src/NTwain/Triplets/ControlDATs/SetupFileXfer.cs index 4313c38..308d0d0 100644 --- a/src/NTwain/Triplets/ControlDATs/SetupFileXfer.cs +++ b/src/NTwain/Triplets/ControlDATs/SetupFileXfer.cs @@ -8,14 +8,23 @@ namespace NTwain.Triplets.ControlDATs /// public class SetupFileXfer { - public TWRC Get(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, ref TW_SETUPFILEXFER data) - => DoIt(ref app, ref ds, MSG.GET, ref data); + public TWRC Get(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, out TW_SETUPFILEXFER data) + { + data = default; + return DoIt(ref app, ref ds, MSG.GET, ref data); + } public TWRC Set(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, ref TW_SETUPFILEXFER data) => DoIt(ref app, ref ds, MSG.SET, ref data); - public TWRC GetDefault(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, ref TW_SETUPFILEXFER data) - => DoIt(ref app, ref ds, MSG.GETDEFAULT, ref data); - public TWRC Reset(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, ref TW_SETUPFILEXFER data) - => DoIt(ref app, ref ds, MSG.RESET, ref data); + public TWRC GetDefault(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, out TW_SETUPFILEXFER data) + { + data = default; + return DoIt(ref app, ref ds, MSG.GETDEFAULT, ref data); + } + public TWRC Reset(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, out TW_SETUPFILEXFER data) + { + data = default; + return DoIt(ref app, ref ds, MSG.RESET, ref data); + } static TWRC DoIt(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, MSG msg, ref TW_SETUPFILEXFER data) diff --git a/src/NTwain/TwainAppSession.Xfers.cs b/src/NTwain/TwainAppSession.Xfers.cs index 468f727..75e2804 100644 --- a/src/NTwain/TwainAppSession.Xfers.cs +++ b/src/NTwain/TwainAppSession.Xfers.cs @@ -147,10 +147,10 @@ namespace NTwain //{ //if (_closeDsRequested) //{ - _uiThreadMarshaller.BeginInvoke(() => - { - DisableSource(); - }); + _uiThreadMarshaller.BeginInvoke(() => + { + DisableSource(); + }); //} } @@ -176,7 +176,39 @@ namespace NTwain private STS TransferFileImage() { - return default; + STS sts = default; + try + { + // assuming user already configured the transfer in transferready event + // get what will be transferred + DGControl.SetupFileXfer.Get(ref _appIdentity, ref _currentDS, out TW_SETUPFILEXFER xfer); + // and just start it + sts = WrapInSTS(DGImage.ImageFileXfer.Get(ref _appIdentity, ref _currentDS)); + if (sts.RC == TWRC.XFERDONE) + { + State = STATE.S7; + + try + { + var args = new DataTransferredEventArgs(this, true, xfer); + DataTransferred?.Invoke(this, args); + } + catch { } + } + else + { + HandleNonSuccessXferCode(sts); + } + } + catch (Exception ex) + { + try + { + TransferError?.Invoke(this, new TransferErrorEventArgs(ex)); + } + catch { } + } + return sts; } private STS TransferNativeImage() @@ -235,14 +267,8 @@ namespace NTwain finally { State = STATE.S6; - if (lockedPtr != IntPtr.Zero) - { - Unlock(dataPtr); - } - if (dataPtr != IntPtr.Zero) - { - Free(dataPtr); - } + if (lockedPtr != IntPtr.Zero) Unlock(dataPtr); + if (dataPtr != IntPtr.Zero) Free(dataPtr); } return sts; }