V4 add extimginfo (#37)

* Added my old struct size tester cpp proj.
* Added transfercanceled event like PR #35.
* Renamed datatransferred event.
* Idea for getting EXT_IMAGEINFO in transferred event.
* Renamed twain const and platform classes to shorter name.
* First attempt at reading TW_INFO, probably not correct.
This commit is contained in:
Eugene Wang 2023-04-09 17:52:23 -04:00 committed by GitHub
parent a0da65dcca
commit fe89e661fc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
59 changed files with 3708 additions and 731 deletions

View File

@ -27,24 +27,66 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WinForm32", "samples\WinFor
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WinForm64", "samples\WinForm64\WinForm64.csproj", "{C9666CB2-C9A6-48C8-AB51-D616A48058A7}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "csizes", "csizes\csizes.vcxproj", "{1AABD2DC-3F81-4301-938B-3EC2EDEF38D4}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{3C8A3CF9-A60D-4F21-B866-D291A7AABD4A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3C8A3CF9-A60D-4F21-B866-D291A7AABD4A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3C8A3CF9-A60D-4F21-B866-D291A7AABD4A}.Debug|x64.ActiveCfg = Debug|Any CPU
{3C8A3CF9-A60D-4F21-B866-D291A7AABD4A}.Debug|x64.Build.0 = Debug|Any CPU
{3C8A3CF9-A60D-4F21-B866-D291A7AABD4A}.Debug|x86.ActiveCfg = Debug|Any CPU
{3C8A3CF9-A60D-4F21-B866-D291A7AABD4A}.Debug|x86.Build.0 = Debug|Any CPU
{3C8A3CF9-A60D-4F21-B866-D291A7AABD4A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3C8A3CF9-A60D-4F21-B866-D291A7AABD4A}.Release|Any CPU.Build.0 = Release|Any CPU
{3C8A3CF9-A60D-4F21-B866-D291A7AABD4A}.Release|x64.ActiveCfg = Release|Any CPU
{3C8A3CF9-A60D-4F21-B866-D291A7AABD4A}.Release|x64.Build.0 = Release|Any CPU
{3C8A3CF9-A60D-4F21-B866-D291A7AABD4A}.Release|x86.ActiveCfg = Release|Any CPU
{3C8A3CF9-A60D-4F21-B866-D291A7AABD4A}.Release|x86.Build.0 = Release|Any CPU
{7792A94E-D0B4-440D-8BD5-CA1CA548782C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7792A94E-D0B4-440D-8BD5-CA1CA548782C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7792A94E-D0B4-440D-8BD5-CA1CA548782C}.Debug|x64.ActiveCfg = Debug|Any CPU
{7792A94E-D0B4-440D-8BD5-CA1CA548782C}.Debug|x64.Build.0 = Debug|Any CPU
{7792A94E-D0B4-440D-8BD5-CA1CA548782C}.Debug|x86.ActiveCfg = Debug|Any CPU
{7792A94E-D0B4-440D-8BD5-CA1CA548782C}.Debug|x86.Build.0 = Debug|Any CPU
{7792A94E-D0B4-440D-8BD5-CA1CA548782C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7792A94E-D0B4-440D-8BD5-CA1CA548782C}.Release|Any CPU.Build.0 = Release|Any CPU
{7792A94E-D0B4-440D-8BD5-CA1CA548782C}.Release|x64.ActiveCfg = Release|Any CPU
{7792A94E-D0B4-440D-8BD5-CA1CA548782C}.Release|x64.Build.0 = Release|Any CPU
{7792A94E-D0B4-440D-8BD5-CA1CA548782C}.Release|x86.ActiveCfg = Release|Any CPU
{7792A94E-D0B4-440D-8BD5-CA1CA548782C}.Release|x86.Build.0 = Release|Any CPU
{C9666CB2-C9A6-48C8-AB51-D616A48058A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C9666CB2-C9A6-48C8-AB51-D616A48058A7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C9666CB2-C9A6-48C8-AB51-D616A48058A7}.Debug|x64.ActiveCfg = Debug|Any CPU
{C9666CB2-C9A6-48C8-AB51-D616A48058A7}.Debug|x64.Build.0 = Debug|Any CPU
{C9666CB2-C9A6-48C8-AB51-D616A48058A7}.Debug|x86.ActiveCfg = Debug|Any CPU
{C9666CB2-C9A6-48C8-AB51-D616A48058A7}.Debug|x86.Build.0 = Debug|Any CPU
{C9666CB2-C9A6-48C8-AB51-D616A48058A7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C9666CB2-C9A6-48C8-AB51-D616A48058A7}.Release|Any CPU.Build.0 = Release|Any CPU
{C9666CB2-C9A6-48C8-AB51-D616A48058A7}.Release|x64.ActiveCfg = Release|Any CPU
{C9666CB2-C9A6-48C8-AB51-D616A48058A7}.Release|x64.Build.0 = Release|Any CPU
{C9666CB2-C9A6-48C8-AB51-D616A48058A7}.Release|x86.ActiveCfg = Release|Any CPU
{C9666CB2-C9A6-48C8-AB51-D616A48058A7}.Release|x86.Build.0 = Release|Any CPU
{1AABD2DC-3F81-4301-938B-3EC2EDEF38D4}.Debug|Any CPU.ActiveCfg = Debug|x64
{1AABD2DC-3F81-4301-938B-3EC2EDEF38D4}.Debug|Any CPU.Build.0 = Debug|x64
{1AABD2DC-3F81-4301-938B-3EC2EDEF38D4}.Debug|x64.ActiveCfg = Debug|x64
{1AABD2DC-3F81-4301-938B-3EC2EDEF38D4}.Debug|x64.Build.0 = Debug|x64
{1AABD2DC-3F81-4301-938B-3EC2EDEF38D4}.Debug|x86.ActiveCfg = Debug|Win32
{1AABD2DC-3F81-4301-938B-3EC2EDEF38D4}.Debug|x86.Build.0 = Debug|Win32
{1AABD2DC-3F81-4301-938B-3EC2EDEF38D4}.Release|Any CPU.ActiveCfg = Release|x64
{1AABD2DC-3F81-4301-938B-3EC2EDEF38D4}.Release|Any CPU.Build.0 = Release|x64
{1AABD2DC-3F81-4301-938B-3EC2EDEF38D4}.Release|x64.ActiveCfg = Release|x64
{1AABD2DC-3F81-4301-938B-3EC2EDEF38D4}.Release|x64.Build.0 = Release|x64
{1AABD2DC-3F81-4301-938B-3EC2EDEF38D4}.Release|x86.ActiveCfg = Release|Win32
{1AABD2DC-3F81-4301-938B-3EC2EDEF38D4}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

160
csizes/csizes.vcxproj Normal file
View File

@ -0,0 +1,160 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{1aabd2dc-3f81-4301-938b-3ec2edef38d4}</ProjectGuid>
<RootNamespace>csizes</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
<ProjectName>csizes</ProjectName>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<OutDir>$(ProjectDir)bin\$(Platform)\</OutDir>
</PropertyGroup>
<PropertyGroup>
<IntDir>$(ProjectDir)obj\$(Platform)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="main.cpp" />
<ClCompile Include="pch.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="pch.h" />
<ClInclude Include="twain.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="main.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pch.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="pch.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="twain.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

61
csizes/main.cpp Normal file
View File

@ -0,0 +1,61 @@
// this is used to verify size of things on different platforms and archtectures
#include "pch.h"
#include <iostream>
#include "twain.h"
int main()
{
bool is32 = sizeof(void*) == 4;
bool is64 = sizeof(void*) == 8;
std::cout << (is32 ? "32bit" : "") << (is64 ? "64bit" : "") << std::endl;
std::cout << std::endl;
std::cout << "TW_STR32 = " << sizeof(TW_STR32) << std::endl;
std::cout << "TW_STR64 = " << sizeof(TW_STR64) << std::endl;
std::cout << "TW_STR128 = " << sizeof(TW_STR128) << std::endl;
std::cout << "TW_STR255 = " << sizeof(TW_STR255) << std::endl;
std::cout << std::endl;
std::cout << "TW_INT8 = " << sizeof(TW_INT8) << std::endl;
std::cout << "TW_INT16 = " << sizeof(TW_INT16) << std::endl;
std::cout << "TW_INT32 = " << sizeof(TW_INT32) << std::endl;
std::cout << "TW_UINT8 = " << sizeof(TW_UINT8) << std::endl;
std::cout << "TW_UINT16 = " << sizeof(TW_UINT16) << std::endl;
std::cout << "TW_UINT32 = " << sizeof(TW_UINT32) << std::endl;
std::cout << "TW_BOOL = " << sizeof(TW_BOOL) << std::endl;
std::cout << std::endl;
std::cout << "TW_IDENTITY = " << sizeof(TW_IDENTITY) << std::endl;
std::cout << std::endl;
std::cout << "TW_HANDLE = " << sizeof(TW_HANDLE) << std::endl;
std::cout << "TW_MEMREF = " << sizeof(TW_MEMREF) << std::endl;
std::cout << "TW_UINTPTR= " << sizeof(TW_UINTPTR) << std::endl;
std::cout << std::endl;
std::cout << "TW_ONEVALUE = " << sizeof(TW_ONEVALUE) << std::endl;
std::cout << "TW_ARRAY = " << sizeof(TW_ARRAY) << std::endl;
std::cout << "TW_ENUMERATION = " << sizeof(TW_ENUMERATION) << std::endl;
std::cout << "TW_RANGE = " << sizeof(TW_RANGE) << std::endl;
std::cout << std::endl;
std::cout << "TW_GRAYRESPONSE = " << sizeof(TW_GRAYRESPONSE) << std::endl;
std::cout << "TW_RGBRESPONSE = " << sizeof(TW_RGBRESPONSE) << std::endl;
std::cout << std::endl;
std::cout << "TW_CALLBACK = " << sizeof(TW_CALLBACK) << std::endl;
std::cout << "TW_CALLBACK2 = " << sizeof(TW_CALLBACK2) << std::endl;
std::cout << std::endl;
std::cout << "TW_USERINTERFACE = " << sizeof(TW_USERINTERFACE) << std::endl;
std::cout << "TW_PENDINGXFERS = " << sizeof(TW_PENDINGXFERS) << std::endl;
std::cout << "TW_IMAGEMEMXFER = " << sizeof(TW_IMAGEMEMXFER) << std::endl;
std::cout << "TW_MEMORY = " << sizeof(TW_MEMORY) << std::endl;
std::cout << std::endl;
std::cout << "TW_CAPABILITY = " << sizeof(TW_CAPABILITY) << std::endl;
std::cout << "TW_CUSTOMDSDATA = " << sizeof(TW_CUSTOMDSDATA) << std::endl;
std::cout << "TW_EVENT = " << sizeof(TW_EVENT) << std::endl;
std::cout << "TW_FILESYSTEM = " << sizeof(TW_FILESYSTEM) << std::endl;
std::cout << "TW_JPEGCOMPRESSION = " << sizeof(TW_JPEGCOMPRESSION) << std::endl;
std::cout << "TW_PASSTHRU = " << sizeof(TW_PASSTHRU) << std::endl;
std::cout << "TW_STATUSUTF8 = " << sizeof(TW_STATUSUTF8) << std::endl;
std::cout << "TW_TWAINDIRECT = " << sizeof(TW_TWAINDIRECT) << std::endl;
std::cout << std::endl;
std::cout << "TW_EXTIMAGEINFO = " << sizeof(TW_EXTIMAGEINFO) << std::endl;
std::cout << "TW_INFO = " << sizeof(TW_INFO) << std::endl;
int test;
std::cin >> test;
}

5
csizes/pch.cpp Normal file
View File

@ -0,0 +1,5 @@
// pch.cpp: source file corresponding to the pre-compiled header
#include "pch.h"
// When you are using pre-compiled headers, this source file is necessary for compilation to succeed.

18
csizes/pch.h Normal file
View File

@ -0,0 +1,18 @@
// pch.h: This is a precompiled header file.
// Files listed below are compiled only once, improving build performance for future builds.
// This also affects IntelliSense performance, including code completion and many code browsing features.
// However, files listed here are ALL re-compiled if any one of them is updated between builds.
// Do not add files here that you will be updating frequently as this negates the performance advantage.
#ifndef PCH_H
#define PCH_H
// add headers that you want to pre-compile here
#if _WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#endif
#endif //PCH_H

2302
csizes/twain.h Normal file

File diff suppressed because it is too large Load Diff

View File

@ -25,7 +25,7 @@ namespace WinFormSample
{
var dll = Path.Combine(
Path.GetDirectoryName(Environment.ProcessPath ?? Assembly.GetExecutingAssembly().Location)!,
$@"runtimes\win-{(TwainPlatform.Is32bit ? "x86" : "x64")}\native\TWAINDSM.dll");
$@"runtimes\win-{(TWPlatform.Is32bit ? "x86" : "x64")}\native\TWAINDSM.dll");
__dllPtr = LoadLibraryW(dll);
}

View File

@ -10,6 +10,7 @@ using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Versioning;
using System.Windows.Forms;
namespace WinFormSample
@ -23,16 +24,16 @@ namespace WinFormSample
{
InitializeComponent();
var libVer = FileVersionInfo.GetVersionInfo(typeof(TwainAppSession).Assembly.Location).ProductVersion;
Text += $"{(TwainPlatform.Is32bit ? " 32bit" : " 64bit")} on NTwain {libVer}";
Text += $"{(TWPlatform.Is32bit ? " 32bit" : " 64bit")} on NTwain {libVer}";
TwainPlatform.PreferLegacyDSM = false;
TWPlatform.PreferLegacyDSM = false;
twain = new TwainAppSession(new WinformMarshaller(this), Assembly.GetExecutingAssembly().Location);
twain.StateChanged += Twain_StateChanged;
twain.DefaultSourceChanged += Twain_DefaultSourceChanged;
twain.CurrentSourceChanged += Twain_CurrentSourceChanged;
twain.TransferReady += Twain_TransferReady;
twain.DataTransferred += Twain_DataTransferred;
twain.Transferred += Twain_DataTransferred;
twain.TransferError += Twain_TransferError;
twain.DeviceEvent += Twain_DeviceEvent;
@ -101,7 +102,7 @@ namespace WinFormSample
}
private void Twain_DataTransferred(TwainAppSession sender, DataTransferredEventArgs e)
private void Twain_DataTransferred(TwainAppSession sender, TransferredEventArgs e)
{
Debug.WriteLine($"[thread {Environment.CurrentManagedThreadId}] data transferred with info {e.ImageInfo}");
if (e.Data == null) return;
@ -148,14 +149,18 @@ namespace WinFormSample
{
LoadCapInfoList();
// never seen a driver support these but here it is
var sts = twain.GetCapLabel(CAP.ICAP_SUPPORTEDSIZES, out string? test);
var sts2 = twain.GetCapHelp(CAP.ICAP_SUPPORTEDSIZES, out string? test2);
var sts3 = twain.GetCapLabelEnum(CAP.ICAP_SUPPORTEDSIZES, out IList<string>? test3);
if (sts.RC == TWRC.SUCCESS || sts2.RC == TWRC.SUCCESS || sts3.RC == TWRC.SUCCESS)
// never seen a driver support these but here it is to test it
if (twain.GetCapLabel(CAP.ICAP_SUPPORTEDSIZES, out string? test).RC == TWRC.SUCCESS)
{
Debugger.Break();
Debug.WriteLine($"Supported sizes label from ds = {test}");
}
if (twain.GetCapHelp(CAP.ICAP_SUPPORTEDSIZES, out string? test2).RC == TWRC.SUCCESS)
{
Debug.WriteLine($"Supported sizes help from ds = {test2}");
}
if (twain.GetCapLabelEnum(CAP.ICAP_SUPPORTEDSIZES, out IList<string>? test3).RC == TWRC.SUCCESS && test3 != null)
{
Debug.WriteLine($"Supported sizes label enum from ds = {string.Join(Environment.NewLine, test3)}");
}
}
else
@ -174,7 +179,7 @@ namespace WinFormSample
if (twain.GetCapCurrent(c, out TW_CAPABILITY twcap).RC == TWRC.SUCCESS)
{
var enumType = KnownCapEnumMap.GetEnumType(c);
var enumType = SizeAndConversionUtils.GetEnumType(c);
var realType = twcap.DetermineValueType(twain);
it.SubItems.Add(enumType?.Name.ToString() ?? realType.ToString());
it.SubItems.Add(ReadTypedValue(c, enumType, realType, forCurrent: true));
@ -187,7 +192,9 @@ namespace WinFormSample
it.SubItems.Add("");
}
it.SubItems.Add(extended.Contains(c).ToString());
it.SubItems.Add(twain.QueryCapSupport(c).ToString());
var supports = twain.QueryCapSupport(c);
it.SubItems.Add(supports.ToString());
if (!supports.HasFlag(TWQC.SET)) it.ForeColor = Color.Gray;
capListView.Items.Add(it);
}
}

View File

@ -3,23 +3,25 @@ using System.Collections.Generic;
namespace NTwain.Data
{
/// <summary>
/// Just an attempt for mapping <see cref="CAP"/>
/// type with its enum value type when applicable.
/// </summary>
public static class KnownCapEnumMap
public static class SizeAndConversionUtils
{
/// <summary>
/// Maps <see cref="CAP"/> id with its enum
/// value type when applicable
/// (e.g. <see cref="CAP.ICAP_XFERMECH"/> to <see cref="TWSX"/>).
/// </summary>
/// <param name="cap"></param>
/// <returns></returns>
public static Type? GetEnumType(CAP cap)
{
if (__map.ContainsKey(cap)) return __map[cap];
return null;
}
static readonly Dictionary<CAP, Type> __map = new()
static readonly Dictionary<CAP, Type> __map = new()
{
{ CAP.ACAP_XFERMECH, typeof(TWSX) },
{ CAP.CAP_ALARMS, typeof(TWAL) },
{ CAP.CAP_AUTHOR, typeof(TWSX) },
{ CAP.CAP_AUTOFEED, typeof(TW_BOOL) },
{ CAP.CAP_AUTOMATICSENSEMEDIUM, typeof(TW_BOOL) },
{ CAP.CAP_AUTOSCAN, typeof(TW_BOOL) },
@ -149,6 +151,40 @@ namespace NTwain.Data
{ CAP.ICAP_TILES, typeof(TW_BOOL) },
{ CAP.ICAP_UNDEFINEDIMAGESIZE, typeof(TW_BOOL) },
{ CAP.ICAP_UNITS, typeof(TWUN) },
{ CAP.ICAP_XFERMECH, typeof(TWSX) },
};
/// <summary>
/// Gets the byte size of the TWAIN item value type.
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public static int GetItemTypeSize(this TWTY type)
{
if (__sizes.TryGetValue(type, out int size))
{
return size;
}
return 0;
}
static readonly IDictionary<TWTY, int> __sizes = new Dictionary<TWTY, int>
{
{TWTY.INT8, 1},
{TWTY.UINT8, 1},
{TWTY.INT16, 2},
{TWTY.UINT16, 2},
{TWTY.BOOL, 2},
{TWTY.INT32, 4},
{TWTY.UINT32, 4},
{TWTY.FIX32, 4},
{TWTY.FRAME, 16},
{TWTY.STR32, TW_STR32.Size},
{TWTY.STR64, TW_STR64.Size},
{TWTY.STR128, TW_STR128.Size},
{TWTY.STR255, TW_STR255.Size},
// is it fixed 4 bytes or intptr size?
{TWTY.HANDLE, IntPtr.Size},
};
}
}

View File

@ -206,7 +206,7 @@ namespace NTwain.Data
}
// If we're running on a Mac, take off the prefix 'byte'...
if (a_blMayHavePrefix && TwainPlatform.IsMacOSX)
if (a_blMayHavePrefix && TWPlatform.IsMacOSX)
{
sz = sz.Remove(0, 1);
}
@ -257,7 +257,7 @@ namespace NTwain.Data
{
a_sz = "";
}
else if (a_blMayHavePrefix && TwainPlatform.IsMacOSX)
else if (a_blMayHavePrefix && TWPlatform.IsMacOSX)
{
a_sz = (char)a_sz.Length + a_sz;
}
@ -391,7 +391,7 @@ namespace NTwain.Data
}
// If we're running on a Mac, take off the prefix 'byte'...
if (a_blMayHavePrefix && TwainPlatform.IsMacOSX)
if (a_blMayHavePrefix && TWPlatform.IsMacOSX)
{
sz = sz.Remove(0, 1);
}
@ -442,7 +442,7 @@ namespace NTwain.Data
{
a_sz = "";
}
else if (a_blMayHavePrefix && TwainPlatform.IsMacOSX)
else if (a_blMayHavePrefix && TWPlatform.IsMacOSX)
{
a_sz = (char)a_sz.Length + a_sz;
}
@ -615,7 +615,7 @@ namespace NTwain.Data
}
// If we're running on a Mac, take off the prefix 'byte'...
if (a_blMayHavePrefix && TwainPlatform.IsMacOSX)
if (a_blMayHavePrefix && TWPlatform.IsMacOSX)
{
sz = sz.Remove(0, 1);
}
@ -666,7 +666,7 @@ namespace NTwain.Data
{
a_sz = "";
}
else if (a_blMayHavePrefix && TwainPlatform.IsMacOSX)
else if (a_blMayHavePrefix && TWPlatform.IsMacOSX)
{
a_sz = (char)a_sz.Length + a_sz;
}
@ -919,7 +919,7 @@ namespace NTwain.Data
}
// If we're running on a Mac, take off the prefix 'byte'...
if (a_blMayHavePrefix && TwainPlatform.IsMacOSX)
if (a_blMayHavePrefix && TWPlatform.IsMacOSX)
{
sz = sz.Remove(0, 1);
}
@ -970,7 +970,7 @@ namespace NTwain.Data
{
a_sz = "";
}
else if (a_blMayHavePrefix && TwainPlatform.IsMacOSX)
else if (a_blMayHavePrefix && TWPlatform.IsMacOSX)
{
a_sz = (char)a_sz.Length + a_sz;
}
@ -1241,16 +1241,16 @@ namespace NTwain.Data
/// Provides information about the Event that was raised by the Source.
/// </summary>
[StructLayout(LayoutKind.Sequential, Pack = 2)]
public struct TW_DEVICEEVENT
public partial struct TW_DEVICEEVENT
{
public uint Event;
private uint _Event;
public TW_STR255 DeviceName;
public uint BatteryMinutes;
public short BatteryPercentage;
public int PowerSupply;
public TW_FIX32 XResolution;
public TW_FIX32 YResolution;
public uint FlashUsed2;
private uint _FlashUsed2;
public uint AutomaticCapture;
public uint TimeBeforeFirstCapture;
public uint TimeBetweenCaptures;
@ -1395,225 +1395,226 @@ namespace NTwain.Data
/// This structure is used to pass specific information between the data source and the application.
/// </summary>
[StructLayout(LayoutKind.Sequential, Pack = 2)]
public struct TW_INFO
public partial struct TW_INFO
{
public ushort InfoId;
public ushort ItemType;
public TWEI InfoId;
public TWTY ItemType;
public ushort NumItems;
public ushort ReturnCode;
public TWRC ReturnCode;
[SuppressMessage("Microsoft.Security", "CA2111:PointersShouldNotBeVisible")]
public UIntPtr Item;
}
/// <summary>
/// This structure is used to pass specific information between the data source and the application.
/// </summary>
[StructLayout(LayoutKind.Sequential, Pack = 2)]
public struct TW_EXTIMAGEINFO
public partial struct TW_EXTIMAGEINFO
{
public uint NumInfos;
public TW_INFO Info_000;
public TW_INFO Info_001;
public TW_INFO Info_002;
public TW_INFO Info_003;
public TW_INFO Info_004;
public TW_INFO Info_005;
public TW_INFO Info_006;
public TW_INFO Info_007;
public TW_INFO Info_008;
public TW_INFO Info_009;
public TW_INFO Info_010;
public TW_INFO Info_011;
public TW_INFO Info_012;
public TW_INFO Info_013;
public TW_INFO Info_014;
public TW_INFO Info_015;
public TW_INFO Info_016;
public TW_INFO Info_017;
public TW_INFO Info_018;
public TW_INFO Info_019;
public TW_INFO Info_020;
public TW_INFO Info_021;
public TW_INFO Info_022;
public TW_INFO Info_023;
public TW_INFO Info_024;
public TW_INFO Info_025;
public TW_INFO Info_026;
public TW_INFO Info_027;
public TW_INFO Info_028;
public TW_INFO Info_029;
public TW_INFO Info_030;
public TW_INFO Info_031;
public TW_INFO Info_032;
public TW_INFO Info_033;
public TW_INFO Info_034;
public TW_INFO Info_035;
public TW_INFO Info_036;
public TW_INFO Info_037;
public TW_INFO Info_038;
public TW_INFO Info_039;
public TW_INFO Info_040;
public TW_INFO Info_041;
public TW_INFO Info_042;
public TW_INFO Info_043;
public TW_INFO Info_044;
public TW_INFO Info_045;
public TW_INFO Info_046;
public TW_INFO Info_047;
public TW_INFO Info_048;
public TW_INFO Info_049;
public TW_INFO Info_050;
public TW_INFO Info_051;
public TW_INFO Info_052;
public TW_INFO Info_053;
public TW_INFO Info_054;
public TW_INFO Info_055;
public TW_INFO Info_056;
public TW_INFO Info_057;
public TW_INFO Info_058;
public TW_INFO Info_059;
public TW_INFO Info_060;
public TW_INFO Info_061;
public TW_INFO Info_062;
public TW_INFO Info_063;
public TW_INFO Info_064;
public TW_INFO Info_065;
public TW_INFO Info_066;
public TW_INFO Info_067;
public TW_INFO Info_068;
public TW_INFO Info_069;
public TW_INFO Info_070;
public TW_INFO Info_071;
public TW_INFO Info_072;
public TW_INFO Info_073;
public TW_INFO Info_074;
public TW_INFO Info_075;
public TW_INFO Info_076;
public TW_INFO Info_077;
public TW_INFO Info_078;
public TW_INFO Info_079;
public TW_INFO Info_080;
public TW_INFO Info_081;
public TW_INFO Info_082;
public TW_INFO Info_083;
public TW_INFO Info_084;
public TW_INFO Info_085;
public TW_INFO Info_086;
public TW_INFO Info_087;
public TW_INFO Info_088;
public TW_INFO Info_089;
public TW_INFO Info_090;
public TW_INFO Info_091;
public TW_INFO Info_092;
public TW_INFO Info_093;
public TW_INFO Info_094;
public TW_INFO Info_095;
public TW_INFO Info_096;
public TW_INFO Info_097;
public TW_INFO Info_098;
public TW_INFO Info_099;
public TW_INFO Info_100;
public TW_INFO Info_101;
public TW_INFO Info_102;
public TW_INFO Info_103;
public TW_INFO Info_104;
public TW_INFO Info_105;
public TW_INFO Info_106;
public TW_INFO Info_107;
public TW_INFO Info_108;
public TW_INFO Info_109;
public TW_INFO Info_110;
public TW_INFO Info_111;
public TW_INFO Info_112;
public TW_INFO Info_113;
public TW_INFO Info_114;
public TW_INFO Info_115;
public TW_INFO Info_116;
public TW_INFO Info_117;
public TW_INFO Info_118;
public TW_INFO Info_119;
public TW_INFO Info_120;
public TW_INFO Info_121;
public TW_INFO Info_122;
public TW_INFO Info_123;
public TW_INFO Info_124;
public TW_INFO Info_125;
public TW_INFO Info_126;
public TW_INFO Info_127;
public TW_INFO Info_128;
public TW_INFO Info_129;
public TW_INFO Info_130;
public TW_INFO Info_131;
public TW_INFO Info_132;
public TW_INFO Info_133;
public TW_INFO Info_134;
public TW_INFO Info_135;
public TW_INFO Info_136;
public TW_INFO Info_137;
public TW_INFO Info_138;
public TW_INFO Info_139;
public TW_INFO Info_140;
public TW_INFO Info_141;
public TW_INFO Info_142;
public TW_INFO Info_143;
public TW_INFO Info_144;
public TW_INFO Info_145;
public TW_INFO Info_146;
public TW_INFO Info_147;
public TW_INFO Info_148;
public TW_INFO Info_149;
public TW_INFO Info_150;
public TW_INFO Info_151;
public TW_INFO Info_152;
public TW_INFO Info_153;
public TW_INFO Info_154;
public TW_INFO Info_155;
public TW_INFO Info_156;
public TW_INFO Info_157;
public TW_INFO Info_158;
public TW_INFO Info_159;
public TW_INFO Info_160;
public TW_INFO Info_161;
public TW_INFO Info_162;
public TW_INFO Info_163;
public TW_INFO Info_164;
public TW_INFO Info_165;
public TW_INFO Info_166;
public TW_INFO Info_167;
public TW_INFO Info_168;
public TW_INFO Info_169;
public TW_INFO Info_170;
public TW_INFO Info_171;
public TW_INFO Info_172;
public TW_INFO Info_173;
public TW_INFO Info_174;
public TW_INFO Info_175;
public TW_INFO Info_176;
public TW_INFO Info_177;
public TW_INFO Info_178;
public TW_INFO Info_179;
public TW_INFO Info_180;
public TW_INFO Info_181;
public TW_INFO Info_182;
public TW_INFO Info_183;
public TW_INFO Info_184;
public TW_INFO Info_185;
public TW_INFO Info_186;
public TW_INFO Info_187;
public TW_INFO Info_188;
public TW_INFO Info_189;
public TW_INFO Info_190;
public TW_INFO Info_191;
public TW_INFO Info_192;
public TW_INFO Info_193;
public TW_INFO Info_194;
public TW_INFO Info_195;
public TW_INFO Info_196;
public TW_INFO Info_197;
public TW_INFO Info_198;
public TW_INFO Info_199;
private uint NumInfos;
private TW_INFO Info_000;
private TW_INFO Info_001;
private TW_INFO Info_002;
private TW_INFO Info_003;
private TW_INFO Info_004;
private TW_INFO Info_005;
private TW_INFO Info_006;
private TW_INFO Info_007;
private TW_INFO Info_008;
private TW_INFO Info_009;
private TW_INFO Info_010;
private TW_INFO Info_011;
private TW_INFO Info_012;
private TW_INFO Info_013;
private TW_INFO Info_014;
private TW_INFO Info_015;
private TW_INFO Info_016;
private TW_INFO Info_017;
private TW_INFO Info_018;
private TW_INFO Info_019;
private TW_INFO Info_020;
private TW_INFO Info_021;
private TW_INFO Info_022;
private TW_INFO Info_023;
private TW_INFO Info_024;
private TW_INFO Info_025;
private TW_INFO Info_026;
private TW_INFO Info_027;
private TW_INFO Info_028;
private TW_INFO Info_029;
private TW_INFO Info_030;
private TW_INFO Info_031;
private TW_INFO Info_032;
private TW_INFO Info_033;
private TW_INFO Info_034;
private TW_INFO Info_035;
private TW_INFO Info_036;
private TW_INFO Info_037;
private TW_INFO Info_038;
private TW_INFO Info_039;
private TW_INFO Info_040;
private TW_INFO Info_041;
private TW_INFO Info_042;
private TW_INFO Info_043;
private TW_INFO Info_044;
private TW_INFO Info_045;
private TW_INFO Info_046;
private TW_INFO Info_047;
private TW_INFO Info_048;
private TW_INFO Info_049;
private TW_INFO Info_050;
private TW_INFO Info_051;
private TW_INFO Info_052;
private TW_INFO Info_053;
private TW_INFO Info_054;
private TW_INFO Info_055;
private TW_INFO Info_056;
private TW_INFO Info_057;
private TW_INFO Info_058;
private TW_INFO Info_059;
private TW_INFO Info_060;
private TW_INFO Info_061;
private TW_INFO Info_062;
private TW_INFO Info_063;
private TW_INFO Info_064;
private TW_INFO Info_065;
private TW_INFO Info_066;
private TW_INFO Info_067;
private TW_INFO Info_068;
private TW_INFO Info_069;
private TW_INFO Info_070;
private TW_INFO Info_071;
private TW_INFO Info_072;
private TW_INFO Info_073;
private TW_INFO Info_074;
private TW_INFO Info_075;
private TW_INFO Info_076;
private TW_INFO Info_077;
private TW_INFO Info_078;
private TW_INFO Info_079;
private TW_INFO Info_080;
private TW_INFO Info_081;
private TW_INFO Info_082;
private TW_INFO Info_083;
private TW_INFO Info_084;
private TW_INFO Info_085;
private TW_INFO Info_086;
private TW_INFO Info_087;
private TW_INFO Info_088;
private TW_INFO Info_089;
private TW_INFO Info_090;
private TW_INFO Info_091;
private TW_INFO Info_092;
private TW_INFO Info_093;
private TW_INFO Info_094;
private TW_INFO Info_095;
private TW_INFO Info_096;
private TW_INFO Info_097;
private TW_INFO Info_098;
private TW_INFO Info_099;
public void Get(uint a_uIndex, ref TW_INFO a_twinfo)
// 200 seems overkill for anyone to request
// at once so I cut it down in half
//private TW_INFO Info_100;
//private TW_INFO Info_101;
//private TW_INFO Info_102;
//private TW_INFO Info_103;
//private TW_INFO Info_104;
//private TW_INFO Info_105;
//private TW_INFO Info_106;
//private TW_INFO Info_107;
//private TW_INFO Info_108;
//private TW_INFO Info_109;
//private TW_INFO Info_110;
//private TW_INFO Info_111;
//private TW_INFO Info_112;
//private TW_INFO Info_113;
//private TW_INFO Info_114;
//private TW_INFO Info_115;
//private TW_INFO Info_116;
//private TW_INFO Info_117;
//private TW_INFO Info_118;
//private TW_INFO Info_119;
//private TW_INFO Info_120;
//private TW_INFO Info_121;
//private TW_INFO Info_122;
//private TW_INFO Info_123;
//private TW_INFO Info_124;
//private TW_INFO Info_125;
//private TW_INFO Info_126;
//private TW_INFO Info_127;
//private TW_INFO Info_128;
//private TW_INFO Info_129;
//private TW_INFO Info_130;
//private TW_INFO Info_131;
//private TW_INFO Info_132;
//private TW_INFO Info_133;
//private TW_INFO Info_134;
//private TW_INFO Info_135;
//private TW_INFO Info_136;
//private TW_INFO Info_137;
//private TW_INFO Info_138;
//private TW_INFO Info_139;
//private TW_INFO Info_140;
//private TW_INFO Info_141;
//private TW_INFO Info_142;
//private TW_INFO Info_143;
//private TW_INFO Info_144;
//private TW_INFO Info_145;
//private TW_INFO Info_146;
//private TW_INFO Info_147;
//private TW_INFO Info_148;
//private TW_INFO Info_149;
//private TW_INFO Info_150;
//private TW_INFO Info_151;
//private TW_INFO Info_152;
//private TW_INFO Info_153;
//private TW_INFO Info_154;
//private TW_INFO Info_155;
//private TW_INFO Info_156;
//private TW_INFO Info_157;
//private TW_INFO Info_158;
//private TW_INFO Info_159;
//private TW_INFO Info_160;
//private TW_INFO Info_161;
//private TW_INFO Info_162;
//private TW_INFO Info_163;
//private TW_INFO Info_164;
//private TW_INFO Info_165;
//private TW_INFO Info_166;
//private TW_INFO Info_167;
//private TW_INFO Info_168;
//private TW_INFO Info_169;
//private TW_INFO Info_170;
//private TW_INFO Info_171;
//private TW_INFO Info_172;
//private TW_INFO Info_173;
//private TW_INFO Info_174;
//private TW_INFO Info_175;
//private TW_INFO Info_176;
//private TW_INFO Info_177;
//private TW_INFO Info_178;
//private TW_INFO Info_179;
//private TW_INFO Info_180;
//private TW_INFO Info_181;
//private TW_INFO Info_182;
//private TW_INFO Info_183;
//private TW_INFO Info_184;
//private TW_INFO Info_185;
//private TW_INFO Info_186;
//private TW_INFO Info_187;
//private TW_INFO Info_188;
//private TW_INFO Info_189;
//private TW_INFO Info_190;
//private TW_INFO Info_191;
//private TW_INFO Info_192;
//private TW_INFO Info_193;
//private TW_INFO Info_194;
//private TW_INFO Info_195;
//private TW_INFO Info_196;
//private TW_INFO Info_197;
//private TW_INFO Info_198;
//private TW_INFO Info_199;
public void Get(int a_uIndex, ref TW_INFO a_twinfo)
{
switch (a_uIndex)
{
@ -1718,110 +1719,110 @@ namespace NTwain.Data
case 97: a_twinfo = Info_097; return;
case 98: a_twinfo = Info_098; return;
case 99: a_twinfo = Info_099; return;
case 100: a_twinfo = Info_100; return;
case 101: a_twinfo = Info_101; return;
case 102: a_twinfo = Info_102; return;
case 103: a_twinfo = Info_103; return;
case 104: a_twinfo = Info_104; return;
case 105: a_twinfo = Info_105; return;
case 106: a_twinfo = Info_106; return;
case 107: a_twinfo = Info_107; return;
case 108: a_twinfo = Info_108; return;
case 109: a_twinfo = Info_109; return;
case 110: a_twinfo = Info_110; return;
case 111: a_twinfo = Info_111; return;
case 112: a_twinfo = Info_112; return;
case 113: a_twinfo = Info_113; return;
case 114: a_twinfo = Info_114; return;
case 115: a_twinfo = Info_115; return;
case 116: a_twinfo = Info_116; return;
case 117: a_twinfo = Info_117; return;
case 118: a_twinfo = Info_118; return;
case 119: a_twinfo = Info_119; return;
case 120: a_twinfo = Info_120; return;
case 121: a_twinfo = Info_121; return;
case 122: a_twinfo = Info_122; return;
case 123: a_twinfo = Info_123; return;
case 124: a_twinfo = Info_124; return;
case 125: a_twinfo = Info_125; return;
case 126: a_twinfo = Info_126; return;
case 127: a_twinfo = Info_127; return;
case 128: a_twinfo = Info_128; return;
case 129: a_twinfo = Info_129; return;
case 130: a_twinfo = Info_130; return;
case 131: a_twinfo = Info_131; return;
case 132: a_twinfo = Info_132; return;
case 133: a_twinfo = Info_133; return;
case 134: a_twinfo = Info_134; return;
case 135: a_twinfo = Info_135; return;
case 136: a_twinfo = Info_136; return;
case 137: a_twinfo = Info_137; return;
case 138: a_twinfo = Info_138; return;
case 139: a_twinfo = Info_139; return;
case 140: a_twinfo = Info_140; return;
case 141: a_twinfo = Info_141; return;
case 142: a_twinfo = Info_142; return;
case 143: a_twinfo = Info_143; return;
case 144: a_twinfo = Info_144; return;
case 145: a_twinfo = Info_145; return;
case 146: a_twinfo = Info_146; return;
case 147: a_twinfo = Info_147; return;
case 148: a_twinfo = Info_148; return;
case 149: a_twinfo = Info_149; return;
case 150: a_twinfo = Info_150; return;
case 151: a_twinfo = Info_151; return;
case 152: a_twinfo = Info_152; return;
case 153: a_twinfo = Info_153; return;
case 154: a_twinfo = Info_154; return;
case 155: a_twinfo = Info_155; return;
case 156: a_twinfo = Info_156; return;
case 157: a_twinfo = Info_157; return;
case 158: a_twinfo = Info_158; return;
case 159: a_twinfo = Info_159; return;
case 160: a_twinfo = Info_160; return;
case 161: a_twinfo = Info_161; return;
case 162: a_twinfo = Info_162; return;
case 163: a_twinfo = Info_163; return;
case 164: a_twinfo = Info_164; return;
case 165: a_twinfo = Info_165; return;
case 166: a_twinfo = Info_166; return;
case 167: a_twinfo = Info_167; return;
case 168: a_twinfo = Info_168; return;
case 169: a_twinfo = Info_169; return;
case 170: a_twinfo = Info_170; return;
case 171: a_twinfo = Info_171; return;
case 172: a_twinfo = Info_172; return;
case 173: a_twinfo = Info_173; return;
case 174: a_twinfo = Info_174; return;
case 175: a_twinfo = Info_175; return;
case 176: a_twinfo = Info_176; return;
case 177: a_twinfo = Info_177; return;
case 178: a_twinfo = Info_178; return;
case 179: a_twinfo = Info_179; return;
case 180: a_twinfo = Info_180; return;
case 181: a_twinfo = Info_181; return;
case 182: a_twinfo = Info_182; return;
case 183: a_twinfo = Info_183; return;
case 184: a_twinfo = Info_184; return;
case 185: a_twinfo = Info_185; return;
case 186: a_twinfo = Info_186; return;
case 187: a_twinfo = Info_187; return;
case 188: a_twinfo = Info_188; return;
case 189: a_twinfo = Info_189; return;
case 190: a_twinfo = Info_190; return;
case 191: a_twinfo = Info_191; return;
case 192: a_twinfo = Info_192; return;
case 193: a_twinfo = Info_193; return;
case 194: a_twinfo = Info_194; return;
case 195: a_twinfo = Info_195; return;
case 196: a_twinfo = Info_196; return;
case 197: a_twinfo = Info_197; return;
case 198: a_twinfo = Info_198; return;
case 199: a_twinfo = Info_199; return;
//case 100: a_twinfo = Info_100; return;
//case 101: a_twinfo = Info_101; return;
//case 102: a_twinfo = Info_102; return;
//case 103: a_twinfo = Info_103; return;
//case 104: a_twinfo = Info_104; return;
//case 105: a_twinfo = Info_105; return;
//case 106: a_twinfo = Info_106; return;
//case 107: a_twinfo = Info_107; return;
//case 108: a_twinfo = Info_108; return;
//case 109: a_twinfo = Info_109; return;
//case 110: a_twinfo = Info_110; return;
//case 111: a_twinfo = Info_111; return;
//case 112: a_twinfo = Info_112; return;
//case 113: a_twinfo = Info_113; return;
//case 114: a_twinfo = Info_114; return;
//case 115: a_twinfo = Info_115; return;
//case 116: a_twinfo = Info_116; return;
//case 117: a_twinfo = Info_117; return;
//case 118: a_twinfo = Info_118; return;
//case 119: a_twinfo = Info_119; return;
//case 120: a_twinfo = Info_120; return;
//case 121: a_twinfo = Info_121; return;
//case 122: a_twinfo = Info_122; return;
//case 123: a_twinfo = Info_123; return;
//case 124: a_twinfo = Info_124; return;
//case 125: a_twinfo = Info_125; return;
//case 126: a_twinfo = Info_126; return;
//case 127: a_twinfo = Info_127; return;
//case 128: a_twinfo = Info_128; return;
//case 129: a_twinfo = Info_129; return;
//case 130: a_twinfo = Info_130; return;
//case 131: a_twinfo = Info_131; return;
//case 132: a_twinfo = Info_132; return;
//case 133: a_twinfo = Info_133; return;
//case 134: a_twinfo = Info_134; return;
//case 135: a_twinfo = Info_135; return;
//case 136: a_twinfo = Info_136; return;
//case 137: a_twinfo = Info_137; return;
//case 138: a_twinfo = Info_138; return;
//case 139: a_twinfo = Info_139; return;
//case 140: a_twinfo = Info_140; return;
//case 141: a_twinfo = Info_141; return;
//case 142: a_twinfo = Info_142; return;
//case 143: a_twinfo = Info_143; return;
//case 144: a_twinfo = Info_144; return;
//case 145: a_twinfo = Info_145; return;
//case 146: a_twinfo = Info_146; return;
//case 147: a_twinfo = Info_147; return;
//case 148: a_twinfo = Info_148; return;
//case 149: a_twinfo = Info_149; return;
//case 150: a_twinfo = Info_150; return;
//case 151: a_twinfo = Info_151; return;
//case 152: a_twinfo = Info_152; return;
//case 153: a_twinfo = Info_153; return;
//case 154: a_twinfo = Info_154; return;
//case 155: a_twinfo = Info_155; return;
//case 156: a_twinfo = Info_156; return;
//case 157: a_twinfo = Info_157; return;
//case 158: a_twinfo = Info_158; return;
//case 159: a_twinfo = Info_159; return;
//case 160: a_twinfo = Info_160; return;
//case 161: a_twinfo = Info_161; return;
//case 162: a_twinfo = Info_162; return;
//case 163: a_twinfo = Info_163; return;
//case 164: a_twinfo = Info_164; return;
//case 165: a_twinfo = Info_165; return;
//case 166: a_twinfo = Info_166; return;
//case 167: a_twinfo = Info_167; return;
//case 168: a_twinfo = Info_168; return;
//case 169: a_twinfo = Info_169; return;
//case 170: a_twinfo = Info_170; return;
//case 171: a_twinfo = Info_171; return;
//case 172: a_twinfo = Info_172; return;
//case 173: a_twinfo = Info_173; return;
//case 174: a_twinfo = Info_174; return;
//case 175: a_twinfo = Info_175; return;
//case 176: a_twinfo = Info_176; return;
//case 177: a_twinfo = Info_177; return;
//case 178: a_twinfo = Info_178; return;
//case 179: a_twinfo = Info_179; return;
//case 180: a_twinfo = Info_180; return;
//case 181: a_twinfo = Info_181; return;
//case 182: a_twinfo = Info_182; return;
//case 183: a_twinfo = Info_183; return;
//case 184: a_twinfo = Info_184; return;
//case 185: a_twinfo = Info_185; return;
//case 186: a_twinfo = Info_186; return;
//case 187: a_twinfo = Info_187; return;
//case 188: a_twinfo = Info_188; return;
//case 189: a_twinfo = Info_189; return;
//case 190: a_twinfo = Info_190; return;
//case 191: a_twinfo = Info_191; return;
//case 192: a_twinfo = Info_192; return;
//case 193: a_twinfo = Info_193; return;
//case 194: a_twinfo = Info_194; return;
//case 195: a_twinfo = Info_195; return;
//case 196: a_twinfo = Info_196; return;
//case 197: a_twinfo = Info_197; return;
//case 198: a_twinfo = Info_198; return;
//case 199: a_twinfo = Info_199; return;
}
}
public void Set(uint a_uIndex, ref TW_INFO a_twinfo)
public void Set(int a_uIndex, ref TW_INFO a_twinfo)
{
switch (a_uIndex)
{
@ -1926,106 +1927,106 @@ namespace NTwain.Data
case 97: Info_097 = a_twinfo; return;
case 98: Info_098 = a_twinfo; return;
case 99: Info_099 = a_twinfo; return;
case 100: Info_100 = a_twinfo; return;
case 101: Info_101 = a_twinfo; return;
case 102: Info_102 = a_twinfo; return;
case 103: Info_103 = a_twinfo; return;
case 104: Info_104 = a_twinfo; return;
case 105: Info_105 = a_twinfo; return;
case 106: Info_106 = a_twinfo; return;
case 107: Info_107 = a_twinfo; return;
case 108: Info_108 = a_twinfo; return;
case 109: Info_109 = a_twinfo; return;
case 110: Info_110 = a_twinfo; return;
case 111: Info_111 = a_twinfo; return;
case 112: Info_112 = a_twinfo; return;
case 113: Info_113 = a_twinfo; return;
case 114: Info_114 = a_twinfo; return;
case 115: Info_115 = a_twinfo; return;
case 116: Info_116 = a_twinfo; return;
case 117: Info_117 = a_twinfo; return;
case 118: Info_118 = a_twinfo; return;
case 119: Info_119 = a_twinfo; return;
case 120: Info_120 = a_twinfo; return;
case 121: Info_121 = a_twinfo; return;
case 122: Info_122 = a_twinfo; return;
case 123: Info_123 = a_twinfo; return;
case 124: Info_124 = a_twinfo; return;
case 125: Info_125 = a_twinfo; return;
case 126: Info_126 = a_twinfo; return;
case 127: Info_127 = a_twinfo; return;
case 128: Info_128 = a_twinfo; return;
case 129: Info_129 = a_twinfo; return;
case 130: Info_130 = a_twinfo; return;
case 131: Info_131 = a_twinfo; return;
case 132: Info_132 = a_twinfo; return;
case 133: Info_133 = a_twinfo; return;
case 134: Info_134 = a_twinfo; return;
case 135: Info_135 = a_twinfo; return;
case 136: Info_136 = a_twinfo; return;
case 137: Info_137 = a_twinfo; return;
case 138: Info_138 = a_twinfo; return;
case 139: Info_139 = a_twinfo; return;
case 140: Info_140 = a_twinfo; return;
case 141: Info_141 = a_twinfo; return;
case 142: Info_142 = a_twinfo; return;
case 143: Info_143 = a_twinfo; return;
case 144: Info_144 = a_twinfo; return;
case 145: Info_145 = a_twinfo; return;
case 146: Info_146 = a_twinfo; return;
case 147: Info_147 = a_twinfo; return;
case 148: Info_148 = a_twinfo; return;
case 149: Info_149 = a_twinfo; return;
case 150: Info_150 = a_twinfo; return;
case 151: Info_151 = a_twinfo; return;
case 152: Info_152 = a_twinfo; return;
case 153: Info_153 = a_twinfo; return;
case 154: Info_154 = a_twinfo; return;
case 155: Info_155 = a_twinfo; return;
case 156: Info_156 = a_twinfo; return;
case 157: Info_157 = a_twinfo; return;
case 158: Info_158 = a_twinfo; return;
case 159: Info_159 = a_twinfo; return;
case 160: Info_160 = a_twinfo; return;
case 161: Info_161 = a_twinfo; return;
case 162: Info_162 = a_twinfo; return;
case 163: Info_163 = a_twinfo; return;
case 164: Info_164 = a_twinfo; return;
case 165: Info_165 = a_twinfo; return;
case 166: Info_166 = a_twinfo; return;
case 167: Info_167 = a_twinfo; return;
case 168: Info_168 = a_twinfo; return;
case 169: Info_169 = a_twinfo; return;
case 170: Info_170 = a_twinfo; return;
case 171: Info_171 = a_twinfo; return;
case 172: Info_172 = a_twinfo; return;
case 173: Info_173 = a_twinfo; return;
case 174: Info_174 = a_twinfo; return;
case 175: Info_175 = a_twinfo; return;
case 176: Info_176 = a_twinfo; return;
case 177: Info_177 = a_twinfo; return;
case 178: Info_178 = a_twinfo; return;
case 179: Info_179 = a_twinfo; return;
case 180: Info_180 = a_twinfo; return;
case 181: Info_181 = a_twinfo; return;
case 182: Info_182 = a_twinfo; return;
case 183: Info_183 = a_twinfo; return;
case 184: Info_184 = a_twinfo; return;
case 185: Info_185 = a_twinfo; return;
case 186: Info_186 = a_twinfo; return;
case 187: Info_187 = a_twinfo; return;
case 188: Info_188 = a_twinfo; return;
case 189: Info_189 = a_twinfo; return;
case 190: Info_190 = a_twinfo; return;
case 191: Info_191 = a_twinfo; return;
case 192: Info_192 = a_twinfo; return;
case 193: Info_193 = a_twinfo; return;
case 194: Info_194 = a_twinfo; return;
case 195: Info_195 = a_twinfo; return;
case 196: Info_196 = a_twinfo; return;
case 197: Info_197 = a_twinfo; return;
case 198: Info_198 = a_twinfo; return;
case 199: Info_199 = a_twinfo; return;
//case 100: Info_100 = a_twinfo; return;
//case 101: Info_101 = a_twinfo; return;
//case 102: Info_102 = a_twinfo; return;
//case 103: Info_103 = a_twinfo; return;
//case 104: Info_104 = a_twinfo; return;
//case 105: Info_105 = a_twinfo; return;
//case 106: Info_106 = a_twinfo; return;
//case 107: Info_107 = a_twinfo; return;
//case 108: Info_108 = a_twinfo; return;
//case 109: Info_109 = a_twinfo; return;
//case 110: Info_110 = a_twinfo; return;
//case 111: Info_111 = a_twinfo; return;
//case 112: Info_112 = a_twinfo; return;
//case 113: Info_113 = a_twinfo; return;
//case 114: Info_114 = a_twinfo; return;
//case 115: Info_115 = a_twinfo; return;
//case 116: Info_116 = a_twinfo; return;
//case 117: Info_117 = a_twinfo; return;
//case 118: Info_118 = a_twinfo; return;
//case 119: Info_119 = a_twinfo; return;
//case 120: Info_120 = a_twinfo; return;
//case 121: Info_121 = a_twinfo; return;
//case 122: Info_122 = a_twinfo; return;
//case 123: Info_123 = a_twinfo; return;
//case 124: Info_124 = a_twinfo; return;
//case 125: Info_125 = a_twinfo; return;
//case 126: Info_126 = a_twinfo; return;
//case 127: Info_127 = a_twinfo; return;
//case 128: Info_128 = a_twinfo; return;
//case 129: Info_129 = a_twinfo; return;
//case 130: Info_130 = a_twinfo; return;
//case 131: Info_131 = a_twinfo; return;
//case 132: Info_132 = a_twinfo; return;
//case 133: Info_133 = a_twinfo; return;
//case 134: Info_134 = a_twinfo; return;
//case 135: Info_135 = a_twinfo; return;
//case 136: Info_136 = a_twinfo; return;
//case 137: Info_137 = a_twinfo; return;
//case 138: Info_138 = a_twinfo; return;
//case 139: Info_139 = a_twinfo; return;
//case 140: Info_140 = a_twinfo; return;
//case 141: Info_141 = a_twinfo; return;
//case 142: Info_142 = a_twinfo; return;
//case 143: Info_143 = a_twinfo; return;
//case 144: Info_144 = a_twinfo; return;
//case 145: Info_145 = a_twinfo; return;
//case 146: Info_146 = a_twinfo; return;
//case 147: Info_147 = a_twinfo; return;
//case 148: Info_148 = a_twinfo; return;
//case 149: Info_149 = a_twinfo; return;
//case 150: Info_150 = a_twinfo; return;
//case 151: Info_151 = a_twinfo; return;
//case 152: Info_152 = a_twinfo; return;
//case 153: Info_153 = a_twinfo; return;
//case 154: Info_154 = a_twinfo; return;
//case 155: Info_155 = a_twinfo; return;
//case 156: Info_156 = a_twinfo; return;
//case 157: Info_157 = a_twinfo; return;
//case 158: Info_158 = a_twinfo; return;
//case 159: Info_159 = a_twinfo; return;
//case 160: Info_160 = a_twinfo; return;
//case 161: Info_161 = a_twinfo; return;
//case 162: Info_162 = a_twinfo; return;
//case 163: Info_163 = a_twinfo; return;
//case 164: Info_164 = a_twinfo; return;
//case 165: Info_165 = a_twinfo; return;
//case 166: Info_166 = a_twinfo; return;
//case 167: Info_167 = a_twinfo; return;
//case 168: Info_168 = a_twinfo; return;
//case 169: Info_169 = a_twinfo; return;
//case 170: Info_170 = a_twinfo; return;
//case 171: Info_171 = a_twinfo; return;
//case 172: Info_172 = a_twinfo; return;
//case 173: Info_173 = a_twinfo; return;
//case 174: Info_174 = a_twinfo; return;
//case 175: Info_175 = a_twinfo; return;
//case 176: Info_176 = a_twinfo; return;
//case 177: Info_177 = a_twinfo; return;
//case 178: Info_178 = a_twinfo; return;
//case 179: Info_179 = a_twinfo; return;
//case 180: Info_180 = a_twinfo; return;
//case 181: Info_181 = a_twinfo; return;
//case 182: Info_182 = a_twinfo; return;
//case 183: Info_183 = a_twinfo; return;
//case 184: Info_184 = a_twinfo; return;
//case 185: Info_185 = a_twinfo; return;
//case 186: Info_186 = a_twinfo; return;
//case 187: Info_187 = a_twinfo; return;
//case 188: Info_188 = a_twinfo; return;
//case 189: Info_189 = a_twinfo; return;
//case 190: Info_190 = a_twinfo; return;
//case 191: Info_191 = a_twinfo; return;
//case 192: Info_192 = a_twinfo; return;
//case 193: Info_193 = a_twinfo; return;
//case 194: Info_194 = a_twinfo; return;
//case 195: Info_195 = a_twinfo; return;
//case 196: Info_196 = a_twinfo; return;
//case 197: Info_197 = a_twinfo; return;
//case 198: Info_198 = a_twinfo; return;
//case 199: Info_199 = a_twinfo; return;
}
}
}

View File

@ -11,9 +11,9 @@ namespace NTwain.Data
/// <summary>
/// Contains platform info for twain use.
/// </summary>
public static class TwainPlatform
public static class TWPlatform
{
static TwainPlatform()
static TWPlatform()
{
Is32bit = IntPtr.Size == 4;
@ -78,7 +78,7 @@ namespace NTwain.Data
/// <summary>
/// Contains value that don't fit into enums nicely.
/// </summary>
public static class TwainConst
public static class TWConst
{
/// <summary>
/// Don't care values...
@ -86,12 +86,6 @@ namespace NTwain.Data
public const byte TWON_DONTCARE8 = 0xff;
public const ushort TWON_DONTCARE16 = 0xffff;
public const uint TWON_DONTCARE32 = 0xffffffff;
/// <summary>
/// We're departing from a strict translation of H so that
/// we can achieve a unified status return type.
/// </summary>
public const int STSCC = 0x10000; // get us past the custom space
}
/// <summary>
@ -739,7 +733,7 @@ namespace NTwain.Data
public TW_CAPABILITY(CAP cap)
{
Cap = cap;
ConType = (TWON)TwainConst.TWON_DONTCARE16;
ConType = (TWON)TWConst.TWON_DONTCARE16;
}
/// <summary>
@ -771,9 +765,9 @@ namespace NTwain.Data
/// <returns></returns>
public uint DetermineBufferSize()
{
if (Preferred != TwainConst.TWON_DONTCARE32) return Preferred;
if (MaxBufSize != TwainConst.TWON_DONTCARE32) return MaxBufSize;
if (MinBufSize != TwainConst.TWON_DONTCARE32) return MinBufSize;
if (Preferred != TWConst.TWON_DONTCARE32) return Preferred;
if (MaxBufSize != TWConst.TWON_DONTCARE32) return MaxBufSize;
if (MinBufSize != TWConst.TWON_DONTCARE32) return MinBufSize;
// default to 16 kb if source doesn't really want to say what it needs
return 1024 * 16;
}
@ -789,13 +783,13 @@ namespace NTwain.Data
{
return new TW_IMAGEMEMXFER
{
BytesPerRow = TwainConst.TWON_DONTCARE32,
BytesWritten = TwainConst.TWON_DONTCARE32,
Columns = TwainConst.TWON_DONTCARE32,
Compression = TwainConst.TWON_DONTCARE16,
Rows = TwainConst.TWON_DONTCARE32,
XOffset = TwainConst.TWON_DONTCARE32,
YOffset = TwainConst.TWON_DONTCARE32,
BytesPerRow = TWConst.TWON_DONTCARE32,
BytesWritten = TWConst.TWON_DONTCARE32,
Columns = TWConst.TWON_DONTCARE32,
Compression = TWConst.TWON_DONTCARE16,
Rows = TWConst.TWON_DONTCARE32,
XOffset = TWConst.TWON_DONTCARE32,
YOffset = TWConst.TWON_DONTCARE32,
};
}
}
@ -810,20 +804,288 @@ namespace NTwain.Data
{
return new TW_IMAGEMEMXFER_MACOSX
{
BytesPerRow = TwainConst.TWON_DONTCARE32,
BytesWritten = TwainConst.TWON_DONTCARE32,
Columns = TwainConst.TWON_DONTCARE32,
Compression = TwainConst.TWON_DONTCARE32,
Rows = TwainConst.TWON_DONTCARE32,
XOffset = TwainConst.TWON_DONTCARE32,
YOffset = TwainConst.TWON_DONTCARE32,
BytesPerRow = TWConst.TWON_DONTCARE32,
BytesWritten = TWConst.TWON_DONTCARE32,
Columns = TWConst.TWON_DONTCARE32,
Compression = TWConst.TWON_DONTCARE32,
Rows = TWConst.TWON_DONTCARE32,
XOffset = TWConst.TWON_DONTCARE32,
YOffset = TWConst.TWON_DONTCARE32,
};
}
}
//partial struct TW_DEVICEEVENT
//{
// public TWDE Event { get { return (TWDE)_event; } }
// public TWFL FlashUsed2 { get { return (TWFL)_flashUsed2; } }
//}
partial struct TW_DEVICEEVENT
{
// provide casted versions over raw value
public TWDE Event { get { return (TWDE)_Event; } }
public TWFL FlashUsed2 { get { return (TWFL)_FlashUsed2; } }
}
/// <summary>
/// Container for querying ext image info. After querying and done with
/// the data you must call <see cref="Free(IMemoryManager)"/> to
/// free the memory allocated.
/// </summary>
public partial struct TW_EXTIMAGEINFO
{
/// <summary>
/// A quick way to create a query object with only <see cref="TWEI"/> values.
/// Limit is 100 at this time.
/// </summary>
/// <param name="memMgr"></param>
/// <param name="infoNames"></param>
/// <returns></returns>
public static TW_EXTIMAGEINFO CreateRequest(params TWEI[] infoNames)
{
if (infoNames == null || infoNames.Length == 0) return default;
if (infoNames.Length > 100) throw new InvalidOperationException("Cannot query more than 100 TWEIs at this time.");
TW_EXTIMAGEINFO container = new()
{
NumInfos = (uint)infoNames.Length,
};
for (var i = 0; i < infoNames.Length; i++)
{
TW_INFO info = new() { InfoId = infoNames[i] };
container.Set(i, ref info);
}
return container;
}
/// <summary>
/// Reads the info out of this as array.
/// </summary>
/// <param name="memMgr"></param>
/// <returns></returns>
public TW_INFO[] AsInfos()
{
if (NumInfos == 0) return Array.Empty<TW_INFO>();
var arr = new TW_INFO[NumInfos];
for (var i = 0; i < NumInfos; i++)
{
TW_INFO blah = default;
Get(i, ref blah);
arr[i] = blah;
}
return arr;
}
/// <summary>
/// Frees all data contained here.
/// </summary>
/// <param name="memMgr"></param>
public void Free(IMemoryManager memMgr)
{
#region don't open this
Info_000.Free(memMgr);
Info_001.Free(memMgr);
Info_002.Free(memMgr);
Info_003.Free(memMgr);
Info_004.Free(memMgr);
Info_005.Free(memMgr);
Info_006.Free(memMgr);
Info_007.Free(memMgr);
Info_008.Free(memMgr);
Info_009.Free(memMgr);
Info_010.Free(memMgr);
Info_011.Free(memMgr);
Info_012.Free(memMgr);
Info_013.Free(memMgr);
Info_014.Free(memMgr);
Info_015.Free(memMgr);
Info_016.Free(memMgr);
Info_017.Free(memMgr);
Info_018.Free(memMgr);
Info_019.Free(memMgr);
Info_020.Free(memMgr);
Info_021.Free(memMgr);
Info_022.Free(memMgr);
Info_023.Free(memMgr);
Info_024.Free(memMgr);
Info_025.Free(memMgr);
Info_026.Free(memMgr);
Info_027.Free(memMgr);
Info_028.Free(memMgr);
Info_029.Free(memMgr);
Info_030.Free(memMgr);
Info_031.Free(memMgr);
Info_032.Free(memMgr);
Info_033.Free(memMgr);
Info_034.Free(memMgr);
Info_035.Free(memMgr);
Info_036.Free(memMgr);
Info_037.Free(memMgr);
Info_038.Free(memMgr);
Info_039.Free(memMgr);
Info_040.Free(memMgr);
Info_041.Free(memMgr);
Info_042.Free(memMgr);
Info_043.Free(memMgr);
Info_044.Free(memMgr);
Info_045.Free(memMgr);
Info_046.Free(memMgr);
Info_047.Free(memMgr);
Info_048.Free(memMgr);
Info_049.Free(memMgr);
Info_050.Free(memMgr);
Info_051.Free(memMgr);
Info_052.Free(memMgr);
Info_053.Free(memMgr);
Info_054.Free(memMgr);
Info_055.Free(memMgr);
Info_056.Free(memMgr);
Info_057.Free(memMgr);
Info_058.Free(memMgr);
Info_059.Free(memMgr);
Info_060.Free(memMgr);
Info_061.Free(memMgr);
Info_062.Free(memMgr);
Info_063.Free(memMgr);
Info_064.Free(memMgr);
Info_065.Free(memMgr);
Info_066.Free(memMgr);
Info_067.Free(memMgr);
Info_068.Free(memMgr);
Info_069.Free(memMgr);
Info_070.Free(memMgr);
Info_071.Free(memMgr);
Info_072.Free(memMgr);
Info_073.Free(memMgr);
Info_074.Free(memMgr);
Info_075.Free(memMgr);
Info_076.Free(memMgr);
Info_077.Free(memMgr);
Info_078.Free(memMgr);
Info_079.Free(memMgr);
Info_080.Free(memMgr);
Info_081.Free(memMgr);
Info_082.Free(memMgr);
Info_083.Free(memMgr);
Info_084.Free(memMgr);
Info_085.Free(memMgr);
Info_086.Free(memMgr);
Info_087.Free(memMgr);
Info_088.Free(memMgr);
Info_089.Free(memMgr);
Info_090.Free(memMgr);
Info_091.Free(memMgr);
Info_092.Free(memMgr);
Info_093.Free(memMgr);
Info_094.Free(memMgr);
Info_095.Free(memMgr);
Info_096.Free(memMgr);
Info_097.Free(memMgr);
Info_098.Free(memMgr);
Info_099.Free(memMgr);
#endregion
}
}
partial struct TW_INFO
{
/// <summary>
/// Quick check to see if the <see cref="Item"/> pointer is really
/// a pointer or actual data (ugh).
/// </summary>
public bool IsDataAPointer =>
ItemType == TWTY.HANDLE || (ItemType.GetItemTypeSize() * NumItems) > IntPtr.Size; // should it be intptr.size or just 4?
/// <summary>
/// Try to read out the item as the type specified in <see cref="ItemType"/>.
/// This ONLY works if the data is not a pointer (see <see cref="IsDataAPointer"/>).
/// For pointers you'd read it yourself with
/// <see cref="ValueReader.ReadTWTYData{TValue}(IntPtr, TWTY, int)"/>.
/// Unless it's a handle (<see cref="TWTY.HANDLE"/>) to non-twain-strings, then you'd use
/// <see cref="ReadHandleString(int)"/>.
/// </summary>
/// <param name="type"></param>
/// <typeparam name="TValue"></typeparam>
/// <returns></returns>
public unsafe TValue ReadNonPointerData<TValue>() where TValue : struct
{
if (ReturnCode != TWRC.SUCCESS || NumItems == 0 || IsDataAPointer) return default;
// we can try a trick and make a pointer to this numeric data
// and re-use our pointer reader. There's a good chance this is wrong in many ways.
// TODO: test this idea in some unit test
var value = TWPlatform.Is32bit ? Item.ToUInt32() : Item.ToUInt64(); // the value should be 32bit from the spec but not sure how it'll work in 64bit
var fakePtr = (IntPtr)(&value);
return fakePtr.ReadTWTYData<TValue>(ItemType, 0);
}
/// <summary>
/// Try to read a null-terminated string from the item.
/// </summary>
/// <param name="memMgr"></param>
/// <param name="index">If item is an array specify which string to read</param>
/// <returns></returns>
public unsafe string? ReadHandleString(IMemoryManager memMgr, int index = 0)
{
if (index < 0 || index >= NumItems || !IsDataAPointer) return default;
// why is twain being difficult and not use TW_STR* like a normal person.
// what even is the encoding for those things? Imma yolo it.
string? value;
var itemAsPtr = (IntPtr)Item.ToPointer(); // this is also iffy
if (NumItems == 1)
{
// if 1, item is already the pointer to the string
value = LockAndReadNullTerminatedString(memMgr, itemAsPtr);
}
else
{
// if more than 1, item points to an array of pointers that each points to their own string
var lockPtr = memMgr.Lock(itemAsPtr);
lockPtr += (IntPtr.Size * index);
// is this even correct? I hope it is
var subItemPtr = Marshal.PtrToStructure<IntPtr>(lockPtr);
value = LockAndReadNullTerminatedString(memMgr, subItemPtr);
memMgr.Unlock(itemAsPtr);
}
return value;
}
private string? LockAndReadNullTerminatedString(IMemoryManager memMgr, IntPtr data)
{
var lockPtr = memMgr.Lock(data);
// yolo as ansi, should work in most cases
var value = Marshal.PtrToStringAnsi(lockPtr);
memMgr.Unlock(data);
return value;
}
/// <summary>
/// Frees all DS-allocated memory if necessary.
/// </summary>
/// <param name="memMgr"></param>
internal unsafe void Free(IMemoryManager memMgr)
{
if (ReturnCode != TWRC.SUCCESS || !IsDataAPointer) return;
var itemAsPtr = (IntPtr)Item.ToPointer(); // this is also iffy
if (ItemType == TWTY.HANDLE && NumItems > 1)
{
// must go into each handle in the array and free them individually :(
var lockPtr = memMgr.Lock(itemAsPtr);
for (var i = 0; i < NumItems; i++)
{
// is this even correct? I hope it is
var subItemPtr = Marshal.PtrToStructure<IntPtr>(lockPtr);
memMgr.Free(subItemPtr);
lockPtr += IntPtr.Size;
}
}
memMgr.Free(itemAsPtr);
Item = UIntPtr.Zero;
}
}
}

View File

@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
@ -61,7 +60,7 @@ namespace NTwain.Data
try
{
if (TwainPlatform.IsMacOSX)
if (TWPlatform.IsMacOSX)
{
type = (TWTY)(ushort)(uint)Marshal.ReadInt32(lockedPtr);
@ -103,7 +102,7 @@ namespace NTwain.Data
{
TWTY itemType;
// Mac has a level of indirection and a different structure (ick)...
if (TwainPlatform.IsMacOSX)
if (TWPlatform.IsMacOSX)
{
// Crack the container...
var onevalue = MarshalTo<TW_ONEVALUE_MACOSX>(lockedPtr);
@ -118,7 +117,7 @@ namespace NTwain.Data
lockedPtr += Marshal.SizeOf(onevalue);
}
return ReadContainerData<TValue>(lockedPtr, itemType, 0);
return ReadTWTYData<TValue>(lockedPtr, itemType, 0);
}
finally
{
@ -145,7 +144,7 @@ namespace NTwain.Data
int count = 0;
// Mac has a level of indirection and a different structure (ick)...
if (TwainPlatform.IsMacOSX)
if (TWPlatform.IsMacOSX)
{
// Crack the container...
var twenumerationmacosx = MarshalTo<TW_ENUMERATION_MACOSX>(lockedPtr);
@ -188,7 +187,7 @@ namespace NTwain.Data
for (var i = 0; i < count; i++)
{
retVal.Items[i] = ReadContainerData<TValue>(lockedPtr, itemType, i);
retVal.Items[i] = ReadTWTYData<TValue>(lockedPtr, itemType, i);
}
}
finally
@ -215,7 +214,7 @@ namespace NTwain.Data
uint count;
// Mac has a level of indirection and a different structure (ick)...
if (TwainPlatform.IsMacOSX)
if (TWPlatform.IsMacOSX)
{
// Crack the container...
var twarraymacosx = MarshalTo<TW_ARRAY_MACOSX>(lockedPtr);
@ -235,7 +234,7 @@ namespace NTwain.Data
var arr = new TValue[count];
for (var i = 0; i < count; i++)
{
arr[i] = ReadContainerData<TValue>(lockedPtr, itemType, i);
arr[i] = ReadTWTYData<TValue>(lockedPtr, itemType, i);
}
return arr;
}
@ -264,7 +263,7 @@ namespace NTwain.Data
TW_RANGE_FIX32 twrangefix32 = default;
// Mac has a level of indirection and a different structure (ick)...
if (TwainPlatform.IsMacOSX)
if (TWPlatform.IsMacOSX)
{
var twrangemacosx = MarshalTo<TW_RANGE_MACOSX>(lockedPtr);
var twrangefix32macosx = MarshalTo<TW_RANGE_FIX32_MACOSX>(lockedPtr);
@ -366,7 +365,7 @@ namespace NTwain.Data
{
TWTY itemType;
// Mac has a level of indirection and a different structure (ick)...
if (TwainPlatform.IsMacOSX)
if (TWPlatform.IsMacOSX)
{
// Crack the container...
var onevalue = MarshalTo<TW_ONEVALUE_MACOSX>(lockedPtr);
@ -425,13 +424,13 @@ namespace NTwain.Data
/// <summary>
/// Read the container pointer content.
/// Read the pointer content as a value specified by <see cref="TWTY"/>, except <see cref="TWTY.HANDLE"/>.
/// </summary>
/// <param name="intptr">A locked pointer to the container's data pointer. If data is array this is the 0th item.</param>
/// <param name="intptr">A locked pointer to the data pointer. If data is array this is the 0th item.</param>
/// <param name="type">The twain type.</param>
/// <param name="itemIndex">Index of the item if pointer is array.</param>
/// <returns></returns>
static TValue ReadContainerData<TValue>(IntPtr intptr, TWTY type, int itemIndex) where TValue : struct
public static TValue ReadTWTYData<TValue>(this IntPtr intptr, TWTY type, int itemIndex) where TValue : struct
{
var isEnum = typeof(TValue).IsEnum;

View File

@ -59,7 +59,7 @@ namespace NTwain.Data
TWTY itemType = GetItemType<TValue>();
// Allocate the container (go for worst case, which is TW_STR255)...
if (TwainPlatform.IsMacOSX)
if (TWPlatform.IsMacOSX)
{
twCap.hContainer = memMgr.Alloc((uint)(Marshal.SizeOf(default(TW_ONEVALUE_MACOSX)) + Marshal.SizeOf(default(TW_STR255))));
lockedPtr = memMgr.Lock(twCap.hContainer);
@ -114,7 +114,7 @@ namespace NTwain.Data
TWTY itemType = GetItemType<TValue>();
// Allocate the container (go for worst case, which is TW_STR255)...
if (TwainPlatform.IsMacOSX)
if (TWPlatform.IsMacOSX)
{
// Allocate...
twCap.hContainer = memMgr.Alloc((uint)(Marshal.SizeOf(default(TW_ARRAY_MACOSX)) + ((values.Length + 1) * Marshal.SizeOf(default(TW_STR255)))));
@ -182,7 +182,7 @@ namespace NTwain.Data
TWTY itemType = GetItemType<TValue>();
// Allocate the container (go for worst case, which is TW_STR255)...
if (TwainPlatform.IsMacOSX)
if (TWPlatform.IsMacOSX)
{
// Allocate...
twCap.hContainer = memMgr.Alloc((uint)(Marshal.SizeOf(default(TW_ENUMERATION_MACOSX)) + ((value.Items.Length + 1) * Marshal.SizeOf(default(TW_STR255)))));
@ -270,7 +270,7 @@ namespace NTwain.Data
TWTY itemType = GetItemType<TValue>();
// Allocate the container (go for worst case, which is TW_STR255)...
if (TwainPlatform.IsMacOSX)
if (TWPlatform.IsMacOSX)
{
// Allocate...
twCap.hContainer = memMgr.Alloc((uint)(Marshal.SizeOf(default(TW_RANGE_MACOSX))));
@ -314,7 +314,7 @@ namespace NTwain.Data
default:
throw new NotSupportedException($"{itemType} is not supported for range.");
case TWTY.INT8:
if (TwainPlatform.IsMacOSX)
if (TWPlatform.IsMacOSX)
{
twrangemacosx.ItemType = (uint)itemType;
twrangemacosx.MinValue = (uint)Convert.ToSByte(value.MinValue);
@ -346,7 +346,7 @@ namespace NTwain.Data
//}
break;
case TWTY.UINT8:
if (TwainPlatform.IsMacOSX)
if (TWPlatform.IsMacOSX)
{
twrangemacosx.ItemType = (uint)itemType;
twrangemacosx.MinValue = Convert.ToByte(value.MinValue);
@ -378,7 +378,7 @@ namespace NTwain.Data
//}
break;
case TWTY.INT16:
if (TwainPlatform.IsMacOSX)
if (TWPlatform.IsMacOSX)
{
twrangemacosx.ItemType = (uint)itemType;
twrangemacosx.MinValue = (uint)Convert.ToInt16(value.MinValue);
@ -411,7 +411,7 @@ namespace NTwain.Data
break;
case TWTY.BOOL:
case TWTY.UINT16:
if (TwainPlatform.IsMacOSX)
if (TWPlatform.IsMacOSX)
{
twrangemacosx.ItemType = (uint)itemType;
twrangemacosx.MinValue = Convert.ToUInt16(value.MinValue);
@ -443,7 +443,7 @@ namespace NTwain.Data
//}
break;
case TWTY.INT32:
if (TwainPlatform.IsMacOSX)
if (TWPlatform.IsMacOSX)
{
twrangemacosx.ItemType = (uint)itemType;
twrangemacosx.MinValue = (uint)Convert.ToInt32(value.MinValue);
@ -475,7 +475,7 @@ namespace NTwain.Data
//}
break;
case TWTY.UINT32:
if (TwainPlatform.IsMacOSX)
if (TWPlatform.IsMacOSX)
{
twrangemacosx.ItemType = (uint)itemType;
twrangemacosx.MinValue = Convert.ToUInt32(value.MinValue);
@ -512,7 +512,7 @@ namespace NTwain.Data
double step = Convert.ToDouble(value.StepSize);
double def = Convert.ToDouble(value.DefaultValue);
double current = Convert.ToDouble(value.CurrentValue);
if (TwainPlatform.IsMacOSX)
if (TWPlatform.IsMacOSX)
{
TW_RANGE_FIX32_MACOSX twrangefix32macosx = default;
twrangefix32macosx.ItemType = (uint)itemType;

View File

@ -0,0 +1,10 @@
using NTwain.Data;
using System;
namespace NTwain
{
public class TransferCanceledEventArgs : EventArgs
{
}
}

View File

@ -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;
/// <summary>
/// Whether transferred data is an image or audio.
/// </summary>
@ -57,5 +60,18 @@ namespace NTwain
/// </summary>
public TW_AUDIOINFO AudioInfo { get; }
/// <summary>
/// Gets the ext image info. Use any utility methods on it
/// to read the data. Remember to call <see cref="TW_EXTIMAGEINFO.Free(IMemoryManager)"/>
/// when done.
/// </summary>
/// <param name="container">Container to query. Can be created with <see cref="TW_EXTIMAGEINFO.CreateRequest(TWEI[])"/></param>
/// <returns></returns>
public STS GetExtendedImageInfo(ref TW_EXTIMAGEINFO container)
{
if (_twain == null) return default;
return _twain.GetExtendedImageInfo(ref container);
}
}
}

View File

@ -15,9 +15,9 @@ namespace NTwain.Triplets.AudioDATs
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, MSG msg)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.AUDIO, DAT.AUDIOFILEXFER, msg, IntPtr.Zero);
}
@ -26,11 +26,11 @@ namespace NTwain.Triplets.AudioDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.AUDIO, DAT.AUDIOFILEXFER, msg, IntPtr.Zero);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.AUDIO, DAT.AUDIOFILEXFER, msg, IntPtr.Zero);
}

View File

@ -15,9 +15,9 @@ namespace NTwain.Triplets.AudioDATs
{
data = default;
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.AUDIO, DAT.AUDIOINFO, msg, ref data);
}
@ -26,11 +26,11 @@ namespace NTwain.Triplets.AudioDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.AUDIO, DAT.AUDIOINFO, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.AUDIO, DAT.AUDIOINFO, msg, ref data);
}

View File

@ -16,9 +16,9 @@ namespace NTwain.Triplets.AudioDATs
{
data = default;
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.AUDIO, DAT.AUDIONATIVEXFER, msg, ref data);
}
@ -27,11 +27,11 @@ namespace NTwain.Triplets.AudioDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.AUDIO, DAT.AUDIONATIVEXFER, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.AUDIO, DAT.AUDIONATIVEXFER, msg, ref data);
}

View File

@ -11,9 +11,9 @@ namespace NTwain.Triplets.ControlDATs
public TWRC RegisterCallback(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, ref TW_CALLBACK data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.CALLBACK, MSG.REGISTER_CALLBACK, ref data);
}
@ -22,11 +22,11 @@ namespace NTwain.Triplets.ControlDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.CALLBACK, MSG.REGISTER_CALLBACK, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.CONTROL, DAT.CALLBACK, MSG.REGISTER_CALLBACK, ref data);
}

View File

@ -11,9 +11,9 @@ namespace NTwain.Triplets.ControlDATs
public TWRC RegisterCallback(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, ref TW_CALLBACK2 data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.CALLBACK2, MSG.REGISTER_CALLBACK, ref data);
}
@ -22,11 +22,11 @@ namespace NTwain.Triplets.ControlDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.CALLBACK2, MSG.REGISTER_CALLBACK, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.CONTROL, DAT.CALLBACK2, MSG.REGISTER_CALLBACK, ref data);
}

View File

@ -34,9 +34,9 @@ namespace NTwain.Triplets.ControlDATs
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, MSG msg, ref TW_CAPABILITY data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.CAPABILITY, msg, ref data);
}
@ -45,11 +45,11 @@ namespace NTwain.Triplets.ControlDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.CAPABILITY, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.CONTROL, DAT.CAPABILITY, msg, ref data);
}

View File

@ -32,9 +32,9 @@ namespace NTwain.Triplets.ControlDATs
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, ushort dat, MSG msg, ref TW_CAPABILITY data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, (DAT)dat, msg, ref data);
}
@ -43,11 +43,11 @@ namespace NTwain.Triplets.ControlDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, (DAT)dat, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.CONTROL, (DAT)dat, msg, ref data);
}

View File

@ -20,9 +20,9 @@ namespace NTwain.Triplets.ControlDATs
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, MSG msg, ref TW_CUSTOMDSDATA data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.CUSTOMDSDATA, msg, ref data);
}
@ -31,11 +31,11 @@ namespace NTwain.Triplets.ControlDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.CUSTOMDSDATA, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.CONTROL, DAT.CUSTOMDSDATA, msg, ref data);
}

View File

@ -12,9 +12,9 @@ namespace NTwain.Triplets.ControlDATs
{
data = default;
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.DEVICEEVENT, MSG.GET, ref data);
}
@ -23,11 +23,11 @@ namespace NTwain.Triplets.ControlDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.DEVICEEVENT, MSG.GET, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.CONTROL, DAT.DEVICEEVENT, MSG.GET, ref data);
}

View File

@ -42,9 +42,9 @@ namespace NTwain.Triplets.ControlDATs
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, MSG msg, ref TW_ENTRYPOINT entry)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, IntPtr.Zero, DG.CONTROL, DAT.ENTRYPOINT, msg, ref entry);
}
@ -57,10 +57,10 @@ namespace NTwain.Triplets.ControlDATs
//{
// var app = Session._appIdentity;
//}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, IntPtr.Zero, DG.CONTROL, DAT.ENTRYPOINT, msg, ref entry);
}

View File

@ -11,9 +11,9 @@ namespace NTwain.Triplets.ControlDATs
public TWRC ProcessEvent(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, ref TW_EVENT data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.EVENT, MSG.PROCESSEVENT, ref data);
}
@ -22,11 +22,11 @@ namespace NTwain.Triplets.ControlDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.EVENT, MSG.PROCESSEVENT, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.CONTROL, DAT.EVENT, MSG.PROCESSEVENT, ref data);
}

View File

@ -34,9 +34,9 @@ namespace NTwain.Triplets.ControlDATs
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, MSG msg, ref TW_FILESYSTEM data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.FILESYSTEM, msg, ref data);
}
@ -45,11 +45,11 @@ namespace NTwain.Triplets.ControlDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.FILESYSTEM, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.CONTROL, DAT.FILESYSTEM, msg, ref data);
}

View File

@ -73,9 +73,9 @@ namespace NTwain.Triplets.ControlDATs
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, MSG msg, ref TW_IDENTITY_LEGACY ds)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, IntPtr.Zero, DG.CONTROL, DAT.IDENTITY, msg, ref ds);
}
@ -84,11 +84,11 @@ namespace NTwain.Triplets.ControlDATs
rc = WinNewDSM.DSM_Entry(ref app, IntPtr.Zero, DG.CONTROL, DAT.IDENTITY, msg, ref ds);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX osxds = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, IntPtr.Zero, DG.CONTROL, DAT.IDENTITY, msg, ref osxds);
}

View File

@ -15,9 +15,9 @@ namespace NTwain.Triplets.ControlDATs
data.SizeOf = (uint)Marshal.SizeOf<TW_METRICS>();
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.METRICS, MSG.GET, ref data);
}
@ -26,11 +26,11 @@ namespace NTwain.Triplets.ControlDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.METRICS, MSG.GET, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.CONTROL, DAT.METRICS, MSG.GET, ref data);
}

View File

@ -30,9 +30,9 @@ namespace NTwain.Triplets.ControlDATs
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, MSG msg, IntPtr hwnd)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, IntPtr.Zero, DG.CONTROL, DAT.PARENT, msg, ref hwnd);
}
@ -47,10 +47,10 @@ namespace NTwain.Triplets.ControlDATs
// rc = NativeMethods.LinuxDsmEntryParent(ref app, IntPtr.Zero, DG.CONTROL, DAT.PARENT, msg, ref hwnd);
// if (rc == TWRC.SUCCESS) Session._appIdentity = app;
//}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, IntPtr.Zero, DG.CONTROL, DAT.PARENT, msg, hwnd);
}

View File

@ -11,9 +11,9 @@ namespace NTwain.Triplets.ControlDATs
public TWRC PassThrough(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, ref TW_PASSTHRU data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.PASSTHRU, MSG.PASSTHRU, ref data);
}
@ -22,11 +22,11 @@ namespace NTwain.Triplets.ControlDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.PASSTHRU, MSG.PASSTHRU, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.CONTROL, DAT.PASSTHRU, MSG.PASSTHRU, ref data);
}

View File

@ -21,9 +21,9 @@ namespace NTwain.Triplets.ControlDATs
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, MSG msg, ref TW_PENDINGXFERS data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.PENDINGXFERS, msg, ref data);
}
@ -32,11 +32,11 @@ namespace NTwain.Triplets.ControlDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.PENDINGXFERS, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.CONTROL, DAT.PENDINGXFERS, msg, ref data);
}

View File

@ -30,9 +30,9 @@ namespace NTwain.Triplets.ControlDATs
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, MSG msg, ref TW_SETUPFILEXFER data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.SETUPFILEXFER, msg, ref data);
}
@ -41,11 +41,11 @@ namespace NTwain.Triplets.ControlDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.SETUPFILEXFER, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.CONTROL, DAT.SETUPFILEXFER, msg, ref data);
}

View File

@ -12,9 +12,9 @@ namespace NTwain.Triplets.ControlDATs
{
data = default;
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.SETUPMEMXFER, MSG.GET, ref data);
}
@ -23,11 +23,11 @@ namespace NTwain.Triplets.ControlDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.SETUPMEMXFER, MSG.GET, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.CONTROL, DAT.SETUPMEMXFER, MSG.GET, ref data);
}

View File

@ -13,9 +13,9 @@ namespace NTwain.Triplets.ControlDATs
{
status = default;
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, IntPtr.Zero, DG.CONTROL, DAT.STATUS, MSG.GET, ref status);
}
@ -24,10 +24,10 @@ namespace NTwain.Triplets.ControlDATs
rc = WinNewDSM.DSM_Entry(ref app, IntPtr.Zero, DG.CONTROL, DAT.STATUS, MSG.GET, ref status);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, IntPtr.Zero, DG.CONTROL, DAT.STATUS, MSG.GET, ref status);
}
@ -43,9 +43,9 @@ namespace NTwain.Triplets.ControlDATs
{
status = default;
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.STATUS, MSG.GET, ref status);
}
@ -54,11 +54,11 @@ namespace NTwain.Triplets.ControlDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.STATUS, MSG.GET, ref status);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX osxds = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref osxds, DG.CONTROL, DAT.STATUS, MSG.GET, ref status);
}

View File

@ -23,9 +23,9 @@ namespace NTwain.Triplets.ControlDATs
{
extendedStatus = new TW_STATUSUTF8 { Status = status };
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, IntPtr.Zero, DG.CONTROL, DAT.STATUSUTF8, MSG.GET, ref extendedStatus);
}
@ -34,10 +34,10 @@ namespace NTwain.Triplets.ControlDATs
rc = WinNewDSM.DSM_Entry(ref app, IntPtr.Zero, DG.CONTROL, DAT.STATUSUTF8, MSG.GET, ref extendedStatus);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, IntPtr.Zero, DG.CONTROL, DAT.STATUSUTF8, MSG.GET, ref extendedStatus);
}

View File

@ -14,9 +14,9 @@ namespace NTwain.Triplets.ControlDATs
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, MSG msg, ref TW_TWAINDIRECT data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.CIECOLOR, msg, ref data);
}
@ -25,11 +25,11 @@ namespace NTwain.Triplets.ControlDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.CIECOLOR, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.CIECOLOR, msg, ref data);
}

View File

@ -20,9 +20,9 @@ namespace NTwain.Triplets.ControlDATs
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, MSG msg, ref TW_USERINTERFACE data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.USERINTERFACE, msg, ref data);
}
@ -31,11 +31,11 @@ namespace NTwain.Triplets.ControlDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.USERINTERFACE, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.CONTROL, DAT.USERINTERFACE, msg, ref data);
}

View File

@ -22,9 +22,9 @@ namespace NTwain.Triplets.ControlDATs
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, MSG msg, ref DG data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.XFERGROUP, msg, ref data);
}
@ -33,11 +33,11 @@ namespace NTwain.Triplets.ControlDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.CONTROL, DAT.XFERGROUP, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.CONTROL, DAT.XFERGROUP, msg, ref data);
}

View File

@ -15,9 +15,9 @@ namespace NTwain.Triplets.ImageDATs
{
var rc = TWRC.FAILURE;
data = default;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.CIECOLOR, msg, ref data);
}
@ -26,11 +26,11 @@ namespace NTwain.Triplets.ImageDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.CIECOLOR, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.CIECOLOR, msg, ref data);
}

View File

@ -8,35 +8,31 @@ namespace NTwain.Triplets.ImageDATs
/// </summary>
public class ExtImageInfo
{
public TWRC Get(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, out TW_EXTIMAGEINFO data)
=> DoIt(ref app, ref ds, MSG.GET, out data);
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, MSG msg, out TW_EXTIMAGEINFO data)
public TWRC Get(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, ref TW_EXTIMAGEINFO data)
{
var rc = TWRC.FAILURE;
data = default;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.EXTIMAGEINFO, msg, ref data);
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.EXTIMAGEINFO, MSG.GET, ref data);
}
else
{
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.EXTIMAGEINFO, msg, ref data);
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.EXTIMAGEINFO, MSG.GET, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.EXTIMAGEINFO, msg, ref data);
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.EXTIMAGEINFO, MSG.GET, ref data);
}
else
{
rc = OSXNewDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.EXTIMAGEINFO, msg, ref data);
rc = OSXNewDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.EXTIMAGEINFO, MSG.GET, ref data);
}
}
return rc;

View File

@ -29,9 +29,9 @@ namespace NTwain.Triplets.ImageDATs
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, MSG msg, ref TW_FILTER data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.FILTER, msg, ref data);
}
@ -40,11 +40,11 @@ namespace NTwain.Triplets.ImageDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.FILTER, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.FILTER, msg, ref data);
}

View File

@ -19,9 +19,9 @@ namespace NTwain.Triplets.ImageDATs
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, MSG msg, ref TW_GRAYRESPONSE data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.GRAYRESPONSE, msg, ref data);
}
@ -30,11 +30,11 @@ namespace NTwain.Triplets.ImageDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.GRAYRESPONSE, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.GRAYRESPONSE, msg, ref data);
}

View File

@ -15,9 +15,9 @@ namespace NTwain.Triplets.ImageDATs
{
var rc = TWRC.FAILURE;
data = default;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.ICCPROFILE, msg, ref data);
}
@ -26,11 +26,11 @@ namespace NTwain.Triplets.ImageDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.ICCPROFILE, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.ICCPROFILE, msg, ref data);
}

View File

@ -15,9 +15,9 @@ namespace NTwain.Triplets.ImageDATs
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, MSG msg)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.IMAGEFILEXFER, msg, IntPtr.Zero);
}
@ -26,11 +26,11 @@ namespace NTwain.Triplets.ImageDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.IMAGEFILEXFER, msg, IntPtr.Zero);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.IMAGEFILEXFER, msg, IntPtr.Zero);
}

View File

@ -15,9 +15,9 @@ namespace NTwain.Triplets.ImageDATs
{
var rc = TWRC.FAILURE;
data = default;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.IMAGEINFO, msg, ref data);
}
@ -26,11 +26,11 @@ namespace NTwain.Triplets.ImageDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.IMAGEINFO, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.IMAGEINFO, msg, ref data);
}

View File

@ -29,9 +29,9 @@ namespace NTwain.Triplets.ImageDATs
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, MSG msg, ref TW_IMAGELAYOUT data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.IMAGELAYOUT, msg, ref data);
}
@ -40,11 +40,11 @@ namespace NTwain.Triplets.ImageDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.IMAGELAYOUT, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.IMAGELAYOUT, msg, ref data);
}

View File

@ -11,9 +11,9 @@ namespace NTwain.Triplets.ImageDATs
public TWRC Get(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, ref TW_IMAGEMEMXFER data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.IMAGEMEMFILEXFER, MSG.GET, ref data);
}
@ -29,11 +29,11 @@ namespace NTwain.Triplets.ImageDATs
public TWRC Get(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, ref TW_IMAGEMEMXFER_MACOSX data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsMacOSX)
if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.IMAGEMEMXFER, MSG.GET, ref data);
}

View File

@ -11,9 +11,9 @@ namespace NTwain.Triplets.ImageDATs
public TWRC Get(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, ref TW_IMAGEMEMXFER data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.IMAGEMEMXFER, MSG.GET, ref data);
}
@ -28,11 +28,11 @@ namespace NTwain.Triplets.ImageDATs
public TWRC Get(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, ref TW_IMAGEMEMXFER_MACOSX data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsMacOSX)
if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.IMAGEMEMXFER, MSG.GET, ref data);
}

View File

@ -16,9 +16,9 @@ namespace NTwain.Triplets.ImageDATs
{
var rc = TWRC.FAILURE;
data = IntPtr.Zero;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.IMAGENATIVEXFER, msg, ref data);
}
@ -27,11 +27,11 @@ namespace NTwain.Triplets.ImageDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.IMAGENATIVEXFER, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.IMAGENATIVEXFER, msg, ref data);
}

View File

@ -29,9 +29,9 @@ namespace NTwain.Triplets.ImageDATs
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, MSG msg, ref TW_JPEGCOMPRESSION data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.JPEGCOMPRESSION, msg, ref data);
}
@ -40,11 +40,11 @@ namespace NTwain.Triplets.ImageDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.JPEGCOMPRESSION, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.JPEGCOMPRESSION, msg, ref data);
}

View File

@ -29,9 +29,9 @@ namespace NTwain.Triplets.ImageDATs
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, MSG msg, ref TW_PALETTE8 data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.PALETTE8, msg, ref data);
}
@ -40,11 +40,11 @@ namespace NTwain.Triplets.ImageDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.PALETTE8, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.PALETTE8, msg, ref data);
}

View File

@ -19,9 +19,9 @@ namespace NTwain.Triplets.ImageDATs
static TWRC DoIt(ref TW_IDENTITY_LEGACY app, ref TW_IDENTITY_LEGACY ds, MSG msg, ref TW_RGBRESPONSE data)
{
var rc = TWRC.FAILURE;
if (TwainPlatform.IsWindows)
if (TWPlatform.IsWindows)
{
if (TwainPlatform.Is32bit && TwainPlatform.PreferLegacyDSM)
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
{
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.RGBRESPONSE, msg, ref data);
}
@ -30,11 +30,11 @@ namespace NTwain.Triplets.ImageDATs
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.RGBRESPONSE, msg, ref data);
}
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
TW_IDENTITY_MACOSX app2 = app;
TW_IDENTITY_MACOSX ds2 = ds;
if (TwainPlatform.PreferLegacyDSM)
if (TWPlatform.PreferLegacyDSM)
{
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.RGBRESPONSE, msg, ref data);
}

View File

@ -39,7 +39,7 @@ namespace NTwain
{
IntPtr cbPtr = IntPtr.Zero;
if (TwainPlatform.IsMacOSX)
if (TWPlatform.IsMacOSX)
{
cbPtr = Marshal.GetFunctionPointerForDelegate(_osxCallbackDelegate);
}

View File

@ -17,15 +17,15 @@ namespace NTwain
{
return _entryPoint.DSM_MemAllocate(size);
}
else if (TwainPlatform.IsWindows)
else if (TWPlatform.IsWindows)
{
return NativeMemoryMethods.WinGlobalAlloc(NativeMemoryMethods.AllocFlag.GHND, (UIntPtr)size);
}
else if (TwainPlatform.IsLinux)
else if (TWPlatform.IsLinux)
{
return Marshal.AllocHGlobal((int)size);
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
return Marshal.AllocHGlobal((int)size);
}
@ -43,15 +43,15 @@ namespace NTwain
{
_entryPoint.DSM_MemFree(handle);
}
else if (TwainPlatform.IsWindows)
else if (TWPlatform.IsWindows)
{
NativeMemoryMethods.WinGlobalFree(handle);
}
else if (TwainPlatform.IsLinux)
else if (TWPlatform.IsLinux)
{
Marshal.FreeHGlobal(handle);
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
Marshal.FreeHGlobal(handle);
}
@ -69,15 +69,15 @@ namespace NTwain
{
return _entryPoint.DSM_MemLock(handle);
}
else if (TwainPlatform.IsWindows)
else if (TWPlatform.IsWindows)
{
return NativeMemoryMethods.WinGlobalLock(handle);
}
else if (TwainPlatform.IsLinux)
else if (TWPlatform.IsLinux)
{
return handle;
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
return handle;
}
@ -95,14 +95,14 @@ namespace NTwain
{
_entryPoint.DSM_MemUnlock(handle);
}
else if (TwainPlatform.IsWindows)
else if (TWPlatform.IsWindows)
{
NativeMemoryMethods.WinGlobalUnlock(handle);
}
else if (TwainPlatform.IsLinux)
else if (TWPlatform.IsLinux)
{
}
else if (TwainPlatform.IsMacOSX)
else if (TWPlatform.IsMacOSX)
{
}
else

View File

@ -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;
try
if (StateChanged != null)
{
StateChanged?.Invoke(this, value); // TODO: should care about thread
_uiThreadMarshaller.Invoke(() =>
{
try
{
StateChanged.Invoke(this, value);
}
catch { }
});
}
catch { }
}
}
}
@ -125,8 +127,7 @@ namespace NTwain
/// <summary>
/// Fires when <see cref="State"/> changes.
/// This is not guaranteed to be raised on the UI thread.
/// Fires when <see cref="State"/> changes.
/// </summary>
public event TwainEventDelegate<STATE>? StateChanged;
@ -157,8 +158,14 @@ namespace NTwain
public event TwainEventDelegate<TransferReadyEventArgs>? TransferReady;
/// <summary>
/// Fires when transferred data is available for app to use.
/// Fires when there's a transfer cancellation, e.g. if the user pressed the "Cancel" button.
/// </summary>
public event TwainEventDelegate<DataTransferredEventArgs>? DataTransferred;
public event TwainEventDelegate<TransferCanceledEventArgs>? TransferCanceled;
/// <summary>
/// Fires when transferred data is available for app to use.
/// This is NOT raised on the UI thread for reasons.
/// </summary>
public event TwainEventDelegate<TransferredEventArgs>? Transferred;
}
}

View File

@ -3,14 +3,8 @@ using NTwain.Native;
using NTwain.Triplets;
using System;
using System.Buffers;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
using System.Xml.Serialization;
using static NTwain.Native.ImageTools;
namespace NTwain
{
@ -23,6 +17,17 @@ namespace NTwain
// so the array max is made with 32 MB. Typical usage should be a lot less.
static readonly ArrayPool<byte> XferMemPool = ArrayPool<byte>.Create(32 * 1024 * 1024, 8);
/// <summary>
/// Can only be called in state 7, so it's hidden here and
/// only exposed in data transferred event.
/// </summary>
/// <param name="container"></param>
/// <returns></returns>
internal STS GetExtendedImageInfo(ref TW_EXTIMAGEINFO container)
{
return WrapInSTS(DGImage.ExtImageInfo.Get(ref _appIdentity, ref _currentDS, ref container));
}
/// <summary>
/// Start the transfer loop.
@ -67,14 +72,17 @@ namespace NTwain
do
{
var readyArgs = new TransferReadyEventArgs(pending.Count, (TWEJ)pending.EOJ);
_uiThreadMarshaller.Invoke(() =>
if (TransferReady != null)
{
try
_uiThreadMarshaller.Invoke(() =>
{
TransferReady?.Invoke(this, readyArgs);
}
catch { } // don't let consumer kill the loop if they have exception
});
try
{
TransferReady.Invoke(this, readyArgs);
}
catch { } // don't let consumer kill the loop if they have exception
});
}
if (readyArgs.Cancel == CancelType.EndNow || _closeDsRequested)
{
@ -108,7 +116,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,11 +154,17 @@ namespace NTwain
}
catch (Exception ex)
{
try
if (TransferError != null)
{
TransferError?.Invoke(this, new TransferErrorEventArgs(ex));
_uiThreadMarshaller.Invoke(() =>
{
try
{
TransferError?.Invoke(this, new TransferErrorEventArgs(ex));
}
catch { }
});
}
catch { }
}
}
} while (sts.RC == TWRC.SUCCESS && pending.Count != 0);
@ -176,6 +190,14 @@ namespace NTwain
// ok to keep going
break;
case TWRC.CANCEL:
// might eventually have option to cancel this or all like transfer ready
if (TransferCanceled != null)
{
_uiThreadMarshaller.Invoke(() =>
{
TransferCanceled.Invoke(this, new TransferCanceledEventArgs());
});
};
TW_PENDINGXFERS pending = default;
DGControl.PendingXfers.EndXfer(ref _appIdentity, ref _currentDS, ref pending);
// todo: also reset?
@ -221,8 +243,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 { }
;
@ -255,8 +277,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
@ -307,7 +329,7 @@ namespace NTwain
{
do
{
rc = TwainPlatform.IsMacOSX ?
rc = TWPlatform.IsMacOSX ?
DGImage.ImageMemXfer.Get(ref _appIdentity, ref _currentDS, ref memXferOSX) :
DGImage.ImageMemXfer.Get(ref _appIdentity, ref _currentDS, ref memXfer);
@ -315,7 +337,7 @@ namespace NTwain
{
try
{
var written = TwainPlatform.IsMacOSX ?
var written = TWPlatform.IsMacOSX ?
memXferOSX.BytesWritten : memXfer.BytesWritten;
IntPtr lockedPtr = Lock(memPtr);
@ -387,7 +409,7 @@ namespace NTwain
{
do
{
rc = TwainPlatform.IsMacOSX ?
rc = TWPlatform.IsMacOSX ?
DGImage.ImageMemFileXfer.Get(ref _appIdentity, ref _currentDS, ref memXferOSX) :
DGImage.ImageMemFileXfer.Get(ref _appIdentity, ref _currentDS, ref memXfer);
@ -395,7 +417,7 @@ namespace NTwain
{
try
{
var written = TwainPlatform.IsMacOSX ?
var written = TWPlatform.IsMacOSX ?
memXferOSX.BytesWritten : memXfer.BytesWritten;
IntPtr lockedPtr = Lock(memPtr);
@ -421,8 +443,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 { }
@ -449,8 +471,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 { }
@ -495,8 +517,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

View File

@ -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(() =>
{
State = STATE.S6;
});
//_uiThreadMarshaller.Invoke(() =>
//{
State = STATE.S6;
//});
EnterTransferRoutine();
break;
}