From: Bernd Herd codeberg@herdsoft.com
--- dlls/sane.ds/capability.c | 31 ++++++++++++++++++++++++++----- dlls/sane.ds/sane_i.h | 1 + 2 files changed, 27 insertions(+), 5 deletions(-)
diff --git a/dlls/sane.ds/capability.c b/dlls/sane.ds/capability.c index 5afa4de7d72..908e853a783 100644 --- a/dlls/sane.ds/capability.c +++ b/dlls/sane.ds/capability.c @@ -215,8 +215,13 @@ static TW_UINT16 SANE_ICAPXferMech (pTW_CAPABILITY pCapability, TW_UINT16 action twCC = msg_set(pCapability, &val); if (twCC == TWCC_SUCCESS) { - activeDS.capXferMech = (TW_UINT16) val; - FIXME("Partial Stub: XFERMECH set to %ld, but ignored\n", val); + if (val == TWSX_NATIVE || val == TWSX_MEMORY) + { + activeDS.capXferMech = (TW_UINT16) val; + FIXME("Partial Stub: XFERMECH set to %ld, but ignored\n", val); + } + else + twCC = TWCC_BADVALUE; } break;
@@ -241,6 +246,7 @@ static TW_UINT16 SANE_ICAPXferMech (pTW_CAPABILITY pCapability, TW_UINT16 action static TW_UINT16 SANE_CAPXferCount (pTW_CAPABILITY pCapability, TW_UINT16 action) { TW_UINT32 val; + TW_INT16 val16; TW_UINT16 twCC = TWCC_BADCAP;
TRACE("CAP_XFERCOUNT\n"); @@ -259,8 +265,22 @@ static TW_UINT16 SANE_CAPXferCount (pTW_CAPABILITY pCapability, TW_UINT16 action
case MSG_SET: twCC = msg_set(pCapability, &val); - if (twCC == TWCC_SUCCESS) - FIXME("Partial Stub: XFERCOUNT set to %ld, but ignored\n", val); + val16 = (TW_INT16) val; + if (val16==0) + { + // This case is explicitly mentioned in the TWAIN specification + activeDS.capXferCount = -1; + twCC = TWCC_CHECKSTATUS; + } + else if (val16>0 || val16==-1) + { + activeDS.capXferCount = val16; + TRACE("Set XFERCOUNT %d", activeDS.capXferCount); + } + else + { + twCC = TWCC_BADVALUE; + } break;
case MSG_GETDEFAULT: @@ -268,10 +288,11 @@ static TW_UINT16 SANE_CAPXferCount (pTW_CAPABILITY pCapability, TW_UINT16 action break;
case MSG_RESET: + activeDS.capXferCount = -1; /* .. fall through intentional .. */
case MSG_GETCURRENT: - twCC = set_onevalue(pCapability, TWTY_INT16, -1); + twCC = set_onevalue(pCapability, TWTY_INT16, activeDS.capXferCount); break; } return twCC; diff --git a/dlls/sane.ds/sane_i.h b/dlls/sane.ds/sane_i.h index e35ed77c935..9d6f28d1e80 100644 --- a/dlls/sane.ds/sane_i.h +++ b/dlls/sane.ds/sane_i.h @@ -45,6 +45,7 @@ struct tagActiveDS
/* Capabilities */ TW_UINT16 capXferMech; /* ICAP_XFERMECH */ + TW_INT16 capXferCount; /* ICAP_XFERCOUNT */ BOOL PixelTypeSet; TW_UINT16 defaultPixelType; /* ICAP_PIXELTYPE */ BOOL XResolutionSet;