From acfbec6a3835fb858525cd2500f871098ec87cf8 Mon Sep 17 00:00:00 2001
From: Eugene Wang <8755753+soukoku@users.noreply.github.com>
Date: Sun, 2 Apr 2023 22:48:17 -0400
Subject: [PATCH] Added twaindirect call.
---
src/NTwain.Win/DispatcherMarshaller.cs | 31 -------------
src/NTwain.Win/NTwain.Win.csproj | 16 -------
src/NTwain.Win/WinformMarshaller.cs | 31 -------------
src/NTwain/DSM/DSMGenerator.tt | 7 +++
src/NTwain/DSM/Linux64DSM.cs | 7 +++
src/NTwain/DSM/LinuxBotched64DSM.cs | 7 +++
src/NTwain/DSM/LinuxDSM.cs | 7 +++
src/NTwain/DSM/OSXLegacyDSM.cs | 7 +++
src/NTwain/DSM/OSXNewDSM.cs | 7 +++
src/NTwain/DSM/WinLegacyDSM.cs | 7 +++
src/NTwain/DSM/WinNewDSM.cs | 7 +++
src/NTwain/NTwain.csproj | 4 ++
.../Triplets/ControlDATs/TwainDirect.cs | 44 +++++++++++++++++++
src/NTwain/Triplets/DGControl.cs | 2 +
14 files changed, 106 insertions(+), 78 deletions(-)
delete mode 100644 src/NTwain.Win/DispatcherMarshaller.cs
delete mode 100644 src/NTwain.Win/NTwain.Win.csproj
delete mode 100644 src/NTwain.Win/WinformMarshaller.cs
create mode 100644 src/NTwain/Triplets/ControlDATs/TwainDirect.cs
diff --git a/src/NTwain.Win/DispatcherMarshaller.cs b/src/NTwain.Win/DispatcherMarshaller.cs
deleted file mode 100644
index 87297fd..0000000
--- a/src/NTwain.Win/DispatcherMarshaller.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using System;
-
-namespace NTwain
-{
- ///
- /// Uses a WPF dispatcher to do the work.
- ///
- public class DispatcherMarshaller : IThreadMarshaller
- {
- private readonly System.Windows.Threading.Dispatcher _dispatcher;
-
- ///
- /// Uses a dispatcher whose UI thread is used to run the work.
- ///
- ///
- public DispatcherMarshaller(System.Windows.Threading.Dispatcher dispatcher)
- {
- _dispatcher = dispatcher ?? throw new ArgumentNullException(nameof(dispatcher));
- }
-
- public void BeginInvoke(Delegate work, params object[] args)
- {
- _dispatcher.BeginInvoke(work, args);
- }
-
- public object Invoke(Delegate work, params object[] args)
- {
- return _dispatcher.Invoke(work, args);
- }
- }
-}
diff --git a/src/NTwain.Win/NTwain.Win.csproj b/src/NTwain.Win/NTwain.Win.csproj
deleted file mode 100644
index 246bebb..0000000
--- a/src/NTwain.Win/NTwain.Win.csproj
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
- NTwain.Win
- Contains Windows specific things for NTwain.
- net462;netcoreapp3.1;net5.0-windows;net6.0-windows
- true
- true
- NTwain
-
-
-
-
-
-
-
diff --git a/src/NTwain.Win/WinformMarshaller.cs b/src/NTwain.Win/WinformMarshaller.cs
deleted file mode 100644
index b1f7e25..0000000
--- a/src/NTwain.Win/WinformMarshaller.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using System;
-
-namespace NTwain
-{
- ///
- /// Uses a winform UI thread to do the work.
- ///
- public class WinformMarshaller : IThreadMarshaller
- {
- private readonly System.Windows.Forms.Control _uiControl;
-
- ///
- /// Uses a control whose UI thread is used to run the work.
- ///
- ///
- public WinformMarshaller(System.Windows.Forms.Control uiControl)
- {
- _uiControl = uiControl ?? throw new ArgumentNullException(nameof(uiControl));
- }
-
- public void BeginInvoke(Delegate work, params object[] args)
- {
- _uiControl.BeginInvoke(work, args);
- }
-
- public object Invoke(Delegate work, params object[] args)
- {
- return _uiControl.Invoke(work, args);
- }
- }
-}
diff --git a/src/NTwain/DSM/DSMGenerator.tt b/src/NTwain/DSM/DSMGenerator.tt
index b5b5189..dd9e0b2 100644
--- a/src/NTwain/DSM/DSMGenerator.tt
+++ b/src/NTwain/DSM/DSMGenerator.tt
@@ -140,6 +140,13 @@ namespace NTwain.DSM
DG dg, DAT dat, MSG msg, ref TW_EVENT evt
);
+ [DllImport(DsmName, CharSet = CharSet.Ansi)]
+ public static extern ushort DSM_Entry
+ (
+ ref <#= file.identityClass #> origin, ref <#= file.identityClass #> dest,
+ DG dg, DAT dat, MSG msg, ref TW_TWAINDIRECT task
+ );
+
[DllImport(DsmName, CharSet = CharSet.Ansi)]
public static extern ushort DSM_Entry
(
diff --git a/src/NTwain/DSM/Linux64DSM.cs b/src/NTwain/DSM/Linux64DSM.cs
index 5fcd058..9015ec2 100644
--- a/src/NTwain/DSM/Linux64DSM.cs
+++ b/src/NTwain/DSM/Linux64DSM.cs
@@ -120,6 +120,13 @@ namespace NTwain.DSM
DG dg, DAT dat, MSG msg, ref TW_EVENT evt
);
+ [DllImport(DsmName, CharSet = CharSet.Ansi)]
+ public static extern ushort DSM_Entry
+ (
+ ref TW_IDENTITY_LEGACY origin, ref TW_IDENTITY_LEGACY dest,
+ DG dg, DAT dat, MSG msg, ref TW_TWAINDIRECT task
+ );
+
[DllImport(DsmName, CharSet = CharSet.Ansi)]
public static extern ushort DSM_Entry
(
diff --git a/src/NTwain/DSM/LinuxBotched64DSM.cs b/src/NTwain/DSM/LinuxBotched64DSM.cs
index 5f326b8..38cf660 100644
--- a/src/NTwain/DSM/LinuxBotched64DSM.cs
+++ b/src/NTwain/DSM/LinuxBotched64DSM.cs
@@ -120,6 +120,13 @@ namespace NTwain.DSM
DG dg, DAT dat, MSG msg, ref TW_EVENT evt
);
+ [DllImport(DsmName, CharSet = CharSet.Ansi)]
+ public static extern ushort DSM_Entry
+ (
+ ref TW_IDENTITY origin, ref TW_IDENTITY dest,
+ DG dg, DAT dat, MSG msg, ref TW_TWAINDIRECT task
+ );
+
[DllImport(DsmName, CharSet = CharSet.Ansi)]
public static extern ushort DSM_Entry
(
diff --git a/src/NTwain/DSM/LinuxDSM.cs b/src/NTwain/DSM/LinuxDSM.cs
index fac872b..1f2cb83 100644
--- a/src/NTwain/DSM/LinuxDSM.cs
+++ b/src/NTwain/DSM/LinuxDSM.cs
@@ -120,6 +120,13 @@ namespace NTwain.DSM
DG dg, DAT dat, MSG msg, ref TW_EVENT evt
);
+ [DllImport(DsmName, CharSet = CharSet.Ansi)]
+ public static extern ushort DSM_Entry
+ (
+ ref TW_IDENTITY_LEGACY origin, ref TW_IDENTITY_LEGACY dest,
+ DG dg, DAT dat, MSG msg, ref TW_TWAINDIRECT task
+ );
+
[DllImport(DsmName, CharSet = CharSet.Ansi)]
public static extern ushort DSM_Entry
(
diff --git a/src/NTwain/DSM/OSXLegacyDSM.cs b/src/NTwain/DSM/OSXLegacyDSM.cs
index cf25c83..2feccbe 100644
--- a/src/NTwain/DSM/OSXLegacyDSM.cs
+++ b/src/NTwain/DSM/OSXLegacyDSM.cs
@@ -120,6 +120,13 @@ namespace NTwain.DSM
DG dg, DAT dat, MSG msg, ref TW_EVENT evt
);
+ [DllImport(DsmName, CharSet = CharSet.Ansi)]
+ public static extern ushort DSM_Entry
+ (
+ ref TW_IDENTITY_MACOSX origin, ref TW_IDENTITY_MACOSX dest,
+ DG dg, DAT dat, MSG msg, ref TW_TWAINDIRECT task
+ );
+
[DllImport(DsmName, CharSet = CharSet.Ansi)]
public static extern ushort DSM_Entry
(
diff --git a/src/NTwain/DSM/OSXNewDSM.cs b/src/NTwain/DSM/OSXNewDSM.cs
index ade4406..d12fd4e 100644
--- a/src/NTwain/DSM/OSXNewDSM.cs
+++ b/src/NTwain/DSM/OSXNewDSM.cs
@@ -120,6 +120,13 @@ namespace NTwain.DSM
DG dg, DAT dat, MSG msg, ref TW_EVENT evt
);
+ [DllImport(DsmName, CharSet = CharSet.Ansi)]
+ public static extern ushort DSM_Entry
+ (
+ ref TW_IDENTITY_MACOSX origin, ref TW_IDENTITY_MACOSX dest,
+ DG dg, DAT dat, MSG msg, ref TW_TWAINDIRECT task
+ );
+
[DllImport(DsmName, CharSet = CharSet.Ansi)]
public static extern ushort DSM_Entry
(
diff --git a/src/NTwain/DSM/WinLegacyDSM.cs b/src/NTwain/DSM/WinLegacyDSM.cs
index d5c92be..406245b 100644
--- a/src/NTwain/DSM/WinLegacyDSM.cs
+++ b/src/NTwain/DSM/WinLegacyDSM.cs
@@ -120,6 +120,13 @@ namespace NTwain.DSM
DG dg, DAT dat, MSG msg, ref TW_EVENT evt
);
+ [DllImport(DsmName, CharSet = CharSet.Ansi)]
+ public static extern ushort DSM_Entry
+ (
+ ref TW_IDENTITY_LEGACY origin, ref TW_IDENTITY_LEGACY dest,
+ DG dg, DAT dat, MSG msg, ref TW_TWAINDIRECT task
+ );
+
[DllImport(DsmName, CharSet = CharSet.Ansi)]
public static extern ushort DSM_Entry
(
diff --git a/src/NTwain/DSM/WinNewDSM.cs b/src/NTwain/DSM/WinNewDSM.cs
index a4816db..3205a4b 100644
--- a/src/NTwain/DSM/WinNewDSM.cs
+++ b/src/NTwain/DSM/WinNewDSM.cs
@@ -120,6 +120,13 @@ namespace NTwain.DSM
DG dg, DAT dat, MSG msg, ref TW_EVENT evt
);
+ [DllImport(DsmName, CharSet = CharSet.Ansi)]
+ public static extern ushort DSM_Entry
+ (
+ ref TW_IDENTITY_LEGACY origin, ref TW_IDENTITY_LEGACY dest,
+ DG dg, DAT dat, MSG msg, ref TW_TWAINDIRECT task
+ );
+
[DllImport(DsmName, CharSet = CharSet.Ansi)]
public static extern ushort DSM_Entry
(
diff --git a/src/NTwain/NTwain.csproj b/src/NTwain/NTwain.csproj
index de968e9..34db1ec 100644
--- a/src/NTwain/NTwain.csproj
+++ b/src/NTwain/NTwain.csproj
@@ -28,4 +28,8 @@
DSMGenerator.dummy
+
+
+
+
diff --git a/src/NTwain/Triplets/ControlDATs/TwainDirect.cs b/src/NTwain/Triplets/ControlDATs/TwainDirect.cs
new file mode 100644
index 0000000..e2af955
--- /dev/null
+++ b/src/NTwain/Triplets/ControlDATs/TwainDirect.cs
@@ -0,0 +1,44 @@
+using NTwain.Data;
+using NTwain.DSM;
+
+namespace NTwain.Triplets.ControlDATs
+{
+ ///
+ /// Contains calls used with and .
+ ///
+ public class TwainDirect
+ {
+ public STS SetTask(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, ref TW_TWAINDIRECT data)
+ => DoIt(ref app, ref ds, MSG.SETTASK, ref data);
+
+ static STS DoIt(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, MSG msg, ref TW_TWAINDIRECT data)
+ {
+ var rc = STS.FAILURE;
+ if (TwainPlatform.IsWindows)
+ {
+ if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
+ {
+ rc = (STS)WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.CIECOLOR, msg, ref data);
+ }
+ else
+ {
+ rc = (STS)WinNewDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.CIECOLOR, msg, ref data);
+ }
+ }
+ else if (TwainPlatform.IsMacOSX)
+ {
+ TW_IDENTITY_MACOSX app2 = app;
+ TW_IDENTITY_MACOSX ds2 = ds;
+ if (TwainPlatform.PreferLegacyDSM)
+ {
+ rc = (STS)OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.CIECOLOR, msg, ref data);
+ }
+ else
+ {
+ rc = (STS)OSXNewDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.CIECOLOR, msg, ref data);
+ }
+ }
+ return rc;
+ }
+ }
+}
diff --git a/src/NTwain/Triplets/DGControl.cs b/src/NTwain/Triplets/DGControl.cs
index 89fe318..55ca624 100644
--- a/src/NTwain/Triplets/DGControl.cs
+++ b/src/NTwain/Triplets/DGControl.cs
@@ -41,6 +41,8 @@ namespace NTwain.Triplets
public static readonly StatusUtf8 StatusUtf8 = new();
+ public static readonly TwainDirect TwainDirect = new();
+
public static readonly UserInterface UserInterface = new();
public static readonly XferGroup XferGroup = new();