[sane.ds 4/4] More correctly detect an end of scan job from sane; this enables Acrobat to pull multiple pages in one scan.
Jeremy White
jwhite at codeweavers.com
Thu Mar 5 13:15:29 CST 2009
---
dlls/sane.ds/ds_ctrl.c | 47 +++++++++++++++++++++++++++++++++++------------
dlls/sane.ds/ds_image.c | 43 +++++++++++++++++++++++++++++++------------
dlls/sane.ds/sane_i.h | 1 +
3 files changed, 67 insertions(+), 24 deletions(-)
diff --git a/dlls/sane.ds/ds_ctrl.c b/dlls/sane.ds/ds_ctrl.c
index f204a71..54aa241 100644
--- a/dlls/sane.ds/ds_ctrl.c
+++ b/dlls/sane.ds/ds_ctrl.c
@@ -337,6 +337,7 @@ TW_UINT16 SANE_PendingXfersEndXfer (pTW_IDENTITY pOrigin,
{
TW_UINT16 twRC = TWRC_SUCCESS;
pTW_PENDINGXFERS pPendingXfers = (pTW_PENDINGXFERS) pData;
+ SANE_Status status;
TRACE("DG_CONTROL/DAT_PENDINGXFERS/MSG_ENDXFER\n");
@@ -347,17 +348,22 @@ TW_UINT16 SANE_PendingXfersEndXfer (pTW_IDENTITY pOrigin,
}
else
{
- if (pPendingXfers->Count != 0)
+ pPendingXfers->Count = -1;
+ activeDS.currentState = 6;
+ if (! activeDS.sane_started)
{
- pPendingXfers->Count --;
- activeDS.currentState = 6;
- }
- else
- {
- activeDS.currentState = 5;
- /* Notify the application that it can close the data source */
- if (activeDS.windowMessage)
- PostMessageA(activeDS.hwndOwner, activeDS.windowMessage, MSG_CLOSEDSREQ, 0);
+ status = psane_start (activeDS.deviceHandle);
+ if (status != SANE_STATUS_GOOD)
+ {
+ TRACE("PENDINGXFERS/MSG_ENDXFER sane_start returns %s\n", psane_strstatus(status));
+ pPendingXfers->Count = 0;
+ activeDS.currentState = 5;
+ /* Notify the application that it can close the data source */
+ if (activeDS.windowMessage)
+ PostMessageA(activeDS.hwndOwner, activeDS.windowMessage, MSG_CLOSEDSREQ, 0);
+ }
+ else
+ activeDS.sane_started = TRUE;
}
twRC = TWRC_SUCCESS;
activeDS.twCC = TWCC_SUCCESS;
@@ -372,6 +378,7 @@ TW_UINT16 SANE_PendingXfersGet (pTW_IDENTITY pOrigin,
{
TW_UINT16 twRC = TWRC_SUCCESS;
pTW_PENDINGXFERS pPendingXfers = (pTW_PENDINGXFERS) pData;
+ SANE_Status status;
TRACE("DG_CONTROL/DAT_PENDINGXFERS/MSG_GET\n");
@@ -382,8 +389,18 @@ TW_UINT16 SANE_PendingXfersGet (pTW_IDENTITY pOrigin,
}
else
{
- /* FIXME: we shouldn't return 1 here */
- pPendingXfers->Count = 1;
+ pPendingXfers->Count = -1;
+ if (! activeDS.sane_started)
+ {
+ status = psane_start (activeDS.deviceHandle);
+ if (status != SANE_STATUS_GOOD)
+ {
+ TRACE("PENDINGXFERS/MSG_GET sane_start returns %s\n", psane_strstatus(status));
+ pPendingXfers->Count = 0;
+ }
+ else
+ activeDS.sane_started = TRUE;
+ }
twRC = TWRC_SUCCESS;
activeDS.twCC = TWCC_SUCCESS;
}
@@ -411,6 +428,12 @@ TW_UINT16 SANE_PendingXfersReset (pTW_IDENTITY pOrigin,
activeDS.currentState = 5;
twRC = TWRC_SUCCESS;
activeDS.twCC = TWCC_SUCCESS;
+
+ if (activeDS.sane_started)
+ {
+ psane_cancel (activeDS.deviceHandle);
+ activeDS.sane_started = FALSE;
+ }
}
return twRC;
diff --git a/dlls/sane.ds/ds_image.c b/dlls/sane.ds/ds_image.c
index a78ec4e..5132efb 100644
--- a/dlls/sane.ds/ds_image.c
+++ b/dlls/sane.ds/ds_image.c
@@ -106,6 +106,7 @@ TW_UINT16 SANE_ImageInfoGet (pTW_IDENTITY pOrigin,
{
WARN("psane_get_parameters: %s\n", psane_strstatus (status));
psane_cancel (activeDS.deviceHandle);
+ activeDS.sane_started = FALSE;
activeDS.twCC = TWCC_OPERATIONERROR;
return TWRC_FAILURE;
}
@@ -230,13 +231,17 @@ TW_UINT16 SANE_ImageMemXferGet (pTW_IDENTITY pOrigin,
ScanningDialogBox(activeDS.progressWnd,0);
- status = psane_start (activeDS.deviceHandle);
- if (status != SANE_STATUS_GOOD)
+ if (! activeDS.sane_started)
{
- WARN("psane_start: %s\n", psane_strstatus (status));
- psane_cancel (activeDS.deviceHandle);
- activeDS.twCC = TWCC_OPERATIONERROR;
- return TWRC_FAILURE;
+ status = psane_start (activeDS.deviceHandle);
+ if (status != SANE_STATUS_GOOD)
+ {
+ WARN("psane_start: %s\n", psane_strstatus (status));
+ psane_cancel (activeDS.deviceHandle);
+ activeDS.twCC = TWCC_OPERATIONERROR;
+ return TWRC_FAILURE;
+ }
+ activeDS.sane_started = TRUE;
}
status = psane_get_parameters (activeDS.deviceHandle,
@@ -247,6 +252,7 @@ TW_UINT16 SANE_ImageMemXferGet (pTW_IDENTITY pOrigin,
{
WARN("psane_get_parameters: %s\n", psane_strstatus (status));
psane_cancel (activeDS.deviceHandle);
+ activeDS.sane_started = FALSE;
activeDS.twCC = TWCC_OPERATIONERROR;
return TWRC_FAILURE;
}
@@ -263,6 +269,7 @@ TW_UINT16 SANE_ImageMemXferGet (pTW_IDENTITY pOrigin,
if (pImageMemXfer->Memory.Length < activeDS.sane_param.bytes_per_line)
{
psane_cancel (activeDS.deviceHandle);
+ activeDS.sane_started = FALSE;
activeDS.twCC = TWCC_BADVALUE;
return TWRC_FAILURE;
}
@@ -309,6 +316,7 @@ TW_UINT16 SANE_ImageMemXferGet (pTW_IDENTITY pOrigin,
ScanningDialogBox(activeDS.progressWnd, -1);
TRACE("psane_read: %s\n", psane_strstatus (status));
psane_cancel (activeDS.deviceHandle);
+ activeDS.sane_started = FALSE;
twRC = TWRC_XFERDONE;
}
activeDS.twCC = TWRC_SUCCESS;
@@ -318,6 +326,7 @@ TW_UINT16 SANE_ImageMemXferGet (pTW_IDENTITY pOrigin,
ScanningDialogBox(activeDS.progressWnd, -1);
WARN("psane_read: %s\n", psane_strstatus (status));
psane_cancel (activeDS.deviceHandle);
+ activeDS.sane_started = FALSE;
activeDS.twCC = TWCC_OPERATIONERROR;
twRC = TWRC_FAILURE;
}
@@ -384,13 +393,17 @@ TW_UINT16 SANE_ImageNativeXferGet (pTW_IDENTITY pOrigin,
else
{
/* Transfer an image from the source to the application */
- status = psane_start (activeDS.deviceHandle);
- if (status != SANE_STATUS_GOOD)
+ if (! activeDS.sane_started)
{
- WARN("psane_start: %s\n", psane_strstatus (status));
- psane_cancel (activeDS.deviceHandle);
- activeDS.twCC = TWCC_OPERATIONERROR;
- return TWRC_FAILURE;
+ status = psane_start (activeDS.deviceHandle);
+ if (status != SANE_STATUS_GOOD)
+ {
+ WARN("psane_start: %s\n", psane_strstatus (status));
+ psane_cancel (activeDS.deviceHandle);
+ activeDS.twCC = TWCC_OPERATIONERROR;
+ return TWRC_FAILURE;
+ }
+ activeDS.sane_started = TRUE;
}
status = psane_get_parameters (activeDS.deviceHandle, &activeDS.sane_param);
@@ -399,6 +412,7 @@ TW_UINT16 SANE_ImageNativeXferGet (pTW_IDENTITY pOrigin,
{
WARN("psane_get_parameters: %s\n", psane_strstatus (status));
psane_cancel (activeDS.deviceHandle);
+ activeDS.sane_started = FALSE;
activeDS.twCC = TWCC_OPERATIONERROR;
return TWRC_FAILURE;
}
@@ -413,6 +427,7 @@ TW_UINT16 SANE_ImageNativeXferGet (pTW_IDENTITY pOrigin,
{
FIXME("For NATIVE, we support only 1 bit monochrome and 8 bit Grayscale, not %d\n", activeDS.sane_param.depth);
psane_cancel (activeDS.deviceHandle);
+ activeDS.sane_started = FALSE;
activeDS.twCC = TWCC_OPERATIONERROR;
return TWRC_FAILURE;
}
@@ -421,6 +436,7 @@ TW_UINT16 SANE_ImageNativeXferGet (pTW_IDENTITY pOrigin,
{
FIXME("For NATIVE, we support only GRAY and RGB, not %d\n", activeDS.sane_param.format);
psane_cancel (activeDS.deviceHandle);
+ activeDS.sane_started = FALSE;
activeDS.twCC = TWCC_OPERATIONERROR;
return TWRC_FAILURE;
}
@@ -440,6 +456,7 @@ TW_UINT16 SANE_ImageNativeXferGet (pTW_IDENTITY pOrigin,
if (!header)
{
psane_cancel (activeDS.deviceHandle);
+ activeDS.sane_started = FALSE;
activeDS.twCC = TWCC_LOWMEMORY;
if (hDIB)
GlobalFree(hDIB);
@@ -497,12 +514,14 @@ TW_UINT16 SANE_ImageNativeXferGet (pTW_IDENTITY pOrigin,
{
WARN("psane_read: %s, reading line %d\n", psane_strstatus(status), i);
psane_cancel (activeDS.deviceHandle);
+ activeDS.sane_started = FALSE;
activeDS.twCC = TWCC_OPERATIONERROR;
GlobalFree(hDIB);
return TWRC_FAILURE;
}
psane_cancel (activeDS.deviceHandle);
+ activeDS.sane_started = FALSE;
*pHandle = (TW_UINT32)hDIB;
twRC = TWRC_XFERDONE;
activeDS.twCC = TWCC_SUCCESS;
diff --git a/dlls/sane.ds/sane_i.h b/dlls/sane.ds/sane_i.h
index de2172c..be4bd8f 100644
--- a/dlls/sane.ds/sane_i.h
+++ b/dlls/sane.ds/sane_i.h
@@ -71,6 +71,7 @@ struct tagActiveDS
SANE_Parameters sane_param; /* parameters about the image
transferred */
BOOL sane_param_valid; /* true if valid sane_param*/
+ BOOL sane_started; /* If sane_start has been called */
INT deviceIndex; /* index of the current device */
#endif
/* Capabilities */
More information about the wine-patches
mailing list