[WINSPOOL_PRINT]: Improve the test application:

- Do not hardcode the test file name, but instead take it from the command line (and add a Usage() function);
- Do not use a too large fixed-size buffer to read & print the file, but instead use a correctly-size buffer, get the file size, and then do a loop to read data from the file by chunks & send it to the printer.

svn path=/trunk/; revision=73047
This commit is contained in:
Hermès Bélusca-Maïto 2016-10-26 22:43:53 +00:00
parent b5beb7dffc
commit 688b18d88c
2 changed files with 38 additions and 14 deletions

View file

@ -1,4 +1,4 @@
add_executable(winspool_print main.c) add_executable(winspool_print main.c)
set_module_type(winspool_print win32cui) set_module_type(winspool_print win32cui UNICODE)
add_importlibs(winspool_print winspool msvcrt kernel32) add_importlibs(winspool_print winspool msvcrt kernel32)
add_cd_file(TARGET winspool_print DESTINATION reactos/system32 FOR all) add_cd_file(TARGET winspool_print DESTINATION reactos/system32 FOR all)

View file

@ -1,26 +1,38 @@
#include <stdio.h> #include <stdio.h>
#include <windows.h> #include <windows.h>
int main() void Usage(WCHAR* name)
{
wprintf(L"Usage: %s testfile\n", name);
}
int wmain(int argc, WCHAR* argv[])
{ {
int ReturnValue = 1; int ReturnValue = 1;
DWORD dwRead; DWORD dwFileSize;
DWORD dwWritten; DWORD dwRead, dwWritten;
HANDLE hFile = INVALID_HANDLE_VALUE; HANDLE hFile = INVALID_HANDLE_VALUE;
HANDLE hPrinter = NULL; HANDLE hPrinter = NULL;
DOC_INFO_1W docInfo; DOC_INFO_1W docInfo;
BYTE Buffer[20000]; BYTE Buffer[4096];
hFile = CreateFileW(L"testfile", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if (argc <= 1)
{
Usage(argv[0]);
return 0;
}
hFile = CreateFileW(argv[1], GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hFile == INVALID_HANDLE_VALUE) if (hFile == INVALID_HANDLE_VALUE)
{ {
printf("CreateFileW failed, last error is %lu!\n", GetLastError()); printf("CreateFileW failed, last error is %lu!\n", GetLastError());
goto Cleanup; goto Cleanup;
} }
if (!ReadFile(hFile, Buffer, sizeof(Buffer), &dwRead, NULL)) dwFileSize = GetFileSize(hFile, NULL);
if (dwFileSize == INVALID_FILE_SIZE)
{ {
printf("ReadFile failed, last error is %lu!\n", GetLastError()); printf("File is too big, or GetFileSize failed; last error is %lu!\n", GetLastError());
goto Cleanup; goto Cleanup;
} }
@ -30,6 +42,7 @@ int main()
goto Cleanup; goto Cleanup;
} }
/* Print to a printer, with the "RAW" datatype (pDatatype == NULL or "RAW") */
ZeroMemory(&docInfo, sizeof(docInfo)); ZeroMemory(&docInfo, sizeof(docInfo));
docInfo.pDocName = L"winspool_print"; docInfo.pDocName = L"winspool_print";
@ -45,11 +58,22 @@ int main()
goto Cleanup; goto Cleanup;
} }
while (dwFileSize > 0)
{
dwRead = min(sizeof(Buffer), dwFileSize);
if (!ReadFile(hFile, Buffer, dwRead, &dwRead, NULL))
{
printf("ReadFile failed, last error is %lu!\n", GetLastError());
goto Cleanup;
}
dwFileSize -= dwRead;
if (!WritePrinter(hPrinter, Buffer, dwRead, &dwWritten)) if (!WritePrinter(hPrinter, Buffer, dwRead, &dwWritten))
{ {
printf("WritePrinter failed, last error is %lu!\n", GetLastError()); printf("WritePrinter failed, last error is %lu!\n", GetLastError());
goto Cleanup; goto Cleanup;
} }
}
if (!EndPagePrinter(hPrinter)) if (!EndPagePrinter(hPrinter))
{ {
@ -66,11 +90,11 @@ int main()
ReturnValue = 0; ReturnValue = 0;
Cleanup: Cleanup:
if (hFile != INVALID_HANDLE_VALUE)
CloseHandle(hFile);
if (hPrinter) if (hPrinter)
ClosePrinter(hPrinter); ClosePrinter(hPrinter);
if (hFile != INVALID_HANDLE_VALUE)
CloseHandle(hFile);
return ReturnValue; return ReturnValue;
} }