From: Bernd Herd codeberg@herdsoft.com
--- dlls/sane.ds/capability.c | 33 ++++++++++++++++++++++++++------- dlls/sane.ds/sane_i.h | 1 + 2 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/dlls/sane.ds/capability.c b/dlls/sane.ds/capability.c index 5afa4de7d72..ea31f95e9cf 100644 --- a/dlls/sane.ds/capability.c +++ b/dlls/sane.ds/capability.c @@ -215,10 +215,15 @@ 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); - } - break; + 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;
case MSG_GETDEFAULT: twCC = set_onevalue(pCapability, TWTY_UINT16, TWSX_NATIVE); @@ -259,8 +264,21 @@ 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); + if (val==0) + { + // This case is explicitly mentioned in the TWAIN specification + activeDS.capXferCount = -1; + twCC = TWCC_CHECKSTATUS; + } + else if ((val>0 && val < 32768) || val==(TW_INT32) -1) + { + activeDS.capXferCount = val; + TRACE("Set XFERCOUNT %d", activeDS.capXferCount); + } + else + { + twCC = TWCC_BADVALUE; + } break;
case MSG_GETDEFAULT: @@ -268,10 +286,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;