Module: wine Branch: master Commit: d5373ef6f92d36971859db0746600188ada22a7d URL: https://gitlab.winehq.org/wine/wine/-/commit/d5373ef6f92d36971859db074660018...
Author: Piotr Caban piotr@codeweavers.com Date: Sun Jul 9 13:05:42 2023 +0200
wineps: Buffer data sent to printer port.
---
dlls/wineps.drv/escape.c | 32 ++++++++++++++++++++++++++++++-- dlls/wineps.drv/ps.c | 2 +- dlls/wineps.drv/psdrv.h | 5 ++++- 3 files changed, 35 insertions(+), 4 deletions(-)
diff --git a/dlls/wineps.drv/escape.c b/dlls/wineps.drv/escape.c index 2c1b18fb711..19c1125e50c 100644 --- a/dlls/wineps.drv/escape.c +++ b/dlls/wineps.drv/escape.c @@ -38,13 +38,41 @@
WINE_DEFAULT_DEBUG_CHANNEL(psdrv);
+BOOL flush_spool( print_ctx *ctx ) +{ + DWORD written; + + if (ctx->job.data_cnt) + { + if (!WritePrinter(ctx->job.hprinter, ctx->job.data, ctx->job.data_cnt, &written) || + written != ctx->job.data_cnt) + return FALSE; + } + ctx->job.data_cnt = 0; + return TRUE; +} + DWORD write_spool( print_ctx *ctx, const void *data, DWORD num ) { DWORD written;
- if (!WritePrinter(ctx->job.hprinter, (LPBYTE) data, num, &written) || (written != num)) - return SP_OUTOFDISK; + if (ctx->job.data_cnt + num > ARRAY_SIZE(ctx->job.data)) + { + if (!flush_spool(ctx)) + return SP_OUTOFDISK; + }
+ if (ctx->job.data_cnt + num > ARRAY_SIZE(ctx->job.data)) + { + if (!WritePrinter(ctx->job.hprinter, (LPBYTE) data, num, &written) || + written != num) + return SP_OUTOFDISK; + } + else + { + memcpy(ctx->job.data + ctx->job.data_cnt, data, num); + ctx->job.data_cnt += num; + } return num; }
diff --git a/dlls/wineps.drv/ps.c b/dlls/wineps.drv/ps.c index a8050abe19b..f9f54fa9bc6 100644 --- a/dlls/wineps.drv/ps.c +++ b/dlls/wineps.drv/ps.c @@ -502,7 +502,7 @@ INT PSDRV_WriteFooter( print_ctx *ctx )
sprintf(buf, psfooter, ctx->job.PageNo);
- if( write_spool( ctx, buf, strlen(buf) ) != strlen(buf) ) { + if( write_spool( ctx, buf, strlen(buf) ) != strlen(buf) || !flush_spool(ctx) ) { WARN("WriteSpool error\n"); ret = 0; } diff --git a/dlls/wineps.drv/psdrv.h b/dlls/wineps.drv/psdrv.h index 7b0582bd258..58b5062a01a 100644 --- a/dlls/wineps.drv/psdrv.h +++ b/dlls/wineps.drv/psdrv.h @@ -352,6 +352,8 @@ typedef struct { INT PageNo; BOOL quiet; /* Don't actually output anything */ enum passthrough passthrough_state; + BYTE data[4096]; + int data_cnt; } JOB;
typedef struct @@ -519,7 +521,8 @@ extern BOOL PSDRV_WriteSetDownloadFont(print_ctx *ctx, BOOL vertical); extern BOOL PSDRV_WriteDownloadGlyphShow(print_ctx *ctx, const WORD *glyphs, UINT count); extern BOOL PSDRV_EmptyDownloadList(print_ctx *ctx, BOOL write_undef);
-extern DWORD write_spool( print_ctx *ctx, const void *data, DWORD num ); +extern BOOL flush_spool(print_ctx *ctx); +extern DWORD write_spool(print_ctx *ctx, const void *data, DWORD num);
#define MAX_G_NAME 31 /* max length of PS glyph name */ extern void get_glyph_name(HDC hdc, WORD index, char *name);