diff --git a/harbour/ChangeLog b/harbour/ChangeLog index a3747969c8..b6ac670216 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,14 @@ 2002-12-01 13:30 UTC+0100 Foo Bar */ +2007-10-16 23:58 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) + * source/rtl/isprint.c + - Removed Win32 bitmap printer specific (non-multiplatform) + functionality. For this feature (and more) pls use + hbwin32prn.lib from contrib: + PRINTEREXISTS(), GETDEFAULTPRINTER(), etc. + % Minor optimization. + 2007-10-16 23:08 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) * contrib/xhb/xhbfunc.c * contrib/win32prn/make_b32.bat diff --git a/harbour/source/rtl/isprint.c b/harbour/source/rtl/isprint.c index a3e79ced7f..2ba9780940 100644 --- a/harbour/source/rtl/isprint.c +++ b/harbour/source/rtl/isprint.c @@ -6,7 +6,7 @@ * Harbour Project source code: * ISPRINTER() function * - * Copyright 1999-2002 Viktor Szakats + * Copyright 1999-2007 Viktor Szakats * www - http://www.harbour-project.org * * This program is free software; you can redistribute it and/or modify @@ -50,45 +50,16 @@ * */ -/* - * The following parts are Copyright of the individual authors. - * www - http://www.harbour-project.org - * - * Copyright 2001 Luiz Rafael Culik - * ISPRINTER() support for win32 - * - * See doc/license.txt for licensing terms. - * - */ - -#define HB_OS_WIN_32_USED - #include "hbapi.h" #include "hbapifs.h" - -#undef HB_WIN_32_PRINTERS -#if defined(HB_OS_WIN_32) && !defined(__RSXNT__) && !defined(__CYGWIN__) - -# define HB_WIN_32_PRINTERS -# include -# include - - static BOOL IsPrinterError(HANDLE hPrinter); - - static BOOL GetJobs(HANDLE hPrinter, - JOB_INFO_2 **ppJobInfo, - int *pcJobs, - DWORD *pStatus); - static BOOL DPGetDefaultPrinter(LPTSTR pPrinterName, LPDWORD pdwBufferSize); -#endif - -#define MAXBUFFERSIZE 255 - HB_EXPORT BOOL hb_printerIsReady( char * pszPrinterName ) { BOOL bIsPrinter; + if( pszPrinterName == NULL ) + pszPrinterName = "LPT1"; + #if defined(HB_OS_DOS) /* NOTE: DOS specific solution, using BIOS interrupt */ @@ -144,308 +115,18 @@ HB_EXPORT BOOL hb_printerIsReady( char * pszPrinterName ) return bIsPrinter; } +HB_FUNC( HB_ISPRINTER ) +{ + hb_retl( hb_printerIsReady( hb_parc( 1 ) ) ); +} + /* NOTE: The parameter is an XBase++ extension over CA-Cl*pper. [vszakats] */ HB_FUNC( ISPRINTER ) { #ifdef HB_COMPAT_XPP - char * pszPrinter = hb_parc( 1 ); - hb_retl( hb_printerIsReady( pszPrinter ? pszPrinter : ( char * ) "LPT1" ) ); + HB_FUNC_EXEC( HB_ISPRINTER ); #else - hb_retl( hb_printerIsReady( "LPT1" ) ); + hb_retl( hb_printerIsReady( NULL ) ); #endif } - -HB_FUNC( HB_ISPRINTER ) -{ -#if defined(HB_WIN_32_PRINTERS) - - /* NOTE: This Win32 specific bitmap printer support would have to - go somewhere else. [vszakats] */ - - char DefaultPrinter[MAXBUFFERSIZE]; - DWORD pdwBufferSize = MAXBUFFERSIZE; - HANDLE hPrinter; - char * pszPrinterName; - DPGetDefaultPrinter( ( LPTSTR ) &DefaultPrinter, &pdwBufferSize ); - pszPrinterName = ISCHAR( 1 ) ? hb_parc( 1 ) : ( char * ) DefaultPrinter; - - if( *pszPrinterName && OpenPrinter( pszPrinterName, &hPrinter, NULL ) ) - { - hb_retl( ! IsPrinterError( hPrinter ) ); - CloseHandle( hPrinter ); - } - else - hb_retl( FALSE ); - -#else - char * pszPrinter = hb_parc( 1 ); - hb_retl( hb_printerIsReady( pszPrinter ? pszPrinter : ( char * ) "LPT1" ) ); -#endif -} - - -/* The code below does the check for the printer under Win32 */ - -#if defined(HB_WIN_32_PRINTERS) - -static BOOL IsPrinterError( HANDLE hPrinter ) -{ - JOB_INFO_2 *pJobs; - int cJobs, - i; - DWORD dwPrinterStatus; - - /* - * Get the state information for the Printer Queue and - * the jobs in the Printer Queue. - */ - if (!GetJobs(hPrinter, &pJobs, &cJobs, &dwPrinterStatus)) - return FALSE; - - /* - * If the Printer reports an error, believe it. - */ - if (dwPrinterStatus & - (PRINTER_STATUS_ERROR | - PRINTER_STATUS_PAPER_JAM | - PRINTER_STATUS_PAPER_OUT | - PRINTER_STATUS_PAPER_PROBLEM | - PRINTER_STATUS_OUTPUT_BIN_FULL | - PRINTER_STATUS_NOT_AVAILABLE | - PRINTER_STATUS_NO_TONER | - PRINTER_STATUS_OUT_OF_MEMORY | - PRINTER_STATUS_OFFLINE | - PRINTER_STATUS_DOOR_OPEN)) - { - return TRUE; - } - - /* - * Find the Job in the Queue that is printing. - */ - for (i=0; i < cJobs; i++) - { - if (pJobs[i].Status & JOB_STATUS_PRINTING) - { - /* - * If the job is in an error state, - * report an error for the printer. - * Code could be inserted here to - * attempt an interpretation of the - * pStatus member as well. - */ - if (pJobs[i].Status & - (JOB_STATUS_ERROR | - JOB_STATUS_OFFLINE | - JOB_STATUS_PAPEROUT | - JOB_STATUS_BLOCKED_DEVQ)) - { - return TRUE; - } - } - } - - /* - * No error condition. - */ - return FALSE; - -} - -static BOOL GetJobs(HANDLE hPrinter, /* Handle to the printer. */ - JOB_INFO_2 **ppJobInfo, /* Pointer to be filled. */ - int *pcJobs, /* Count of jobs filled. */ - DWORD *pStatus) /* Print Queue status. */ -{ - - DWORD cByteNeeded; - DWORD nReturned; - DWORD cByteUsed; - JOB_INFO_2 * pJobStorage; - PRINTER_INFO_2 * pPrinterInfo; - -/* Get the buffer size needed. */ - if (!GetPrinter(hPrinter, 2, NULL, 0, &cByteNeeded)) - { - if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) - return FALSE; - } - - pPrinterInfo = (PRINTER_INFO_2 *) hb_xgrab( cByteNeeded ); - if (!(pPrinterInfo)) - /* Failure to allocate memory. */ - return FALSE; - - /* Get the printer information. */ - if (!GetPrinter(hPrinter, - 2, - (LPBYTE)pPrinterInfo, - cByteNeeded, - &cByteUsed)) - { - /* Failure to access the printer. */ - hb_xfree( pPrinterInfo ); - return FALSE; - } - - /* Get job storage space. */ - if (!EnumJobs(hPrinter, - 0, - pPrinterInfo->cJobs, - 2, - NULL, - 0, - (LPDWORD)&cByteNeeded, - (LPDWORD)&nReturned)) - { - if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) - { - hb_xfree( pPrinterInfo ); - return FALSE; - } - } - - pJobStorage = (JOB_INFO_2 *) hb_xgrab( cByteNeeded ); - if (!pJobStorage) - { - /* Failure to allocate Job storage space. */ - hb_xfree( pPrinterInfo ); - return FALSE; - } - - ZeroMemory(pJobStorage, cByteNeeded); - - /* Get the list of jobs. */ - if (!EnumJobs(hPrinter, - 0, - pPrinterInfo->cJobs, - 2, - (LPBYTE)pJobStorage, - cByteNeeded, - (LPDWORD)&cByteUsed, - (LPDWORD)&nReturned)) - { - hb_xfree( pPrinterInfo ); - hb_xfree( pJobStorage ); - return FALSE; - } - - /* - * Return the information. - */ - *pcJobs = nReturned; - *pStatus = pPrinterInfo->Status; - *ppJobInfo = pJobStorage; - hb_xfree( pPrinterInfo ); - - return TRUE; -} - -static BOOL DPGetDefaultPrinter(LPTSTR pPrinterName, LPDWORD pdwBufferSize) -{ - BOOL bFlag; - OSVERSIONINFO osv; - TCHAR cBuffer[MAXBUFFERSIZE], *ptr; - PRINTER_INFO_2 *ppi2 = NULL; - DWORD dwNeeded = 0; - DWORD dwReturned = 0; - - /* What version of Windows are you running? */ - osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&osv); - - /* If Windows 95 or 98, use EnumPrinters... */ - if (osv.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) - { - /* The first EnumPrinters() tells you how big our buffer should - be in order to hold ALL of PRINTER_INFO_2. Note that this will - usually return FALSE. This only means that the buffer (the 4th - parameter) was not filled in. You don't want it filled in here... */ - EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2, NULL, 0, &dwNeeded, &dwReturned); - if (dwNeeded == 0) - return FALSE; - - /* Allocate enough space for PRINTER_INFO_2... */ - ppi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded); - if (!ppi2) - return FALSE; - - /* The second EnumPrinters() will fill in all the current information... */ - bFlag = EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2, (LPBYTE)ppi2, dwNeeded, &dwNeeded, &dwReturned); - if (!bFlag) - { - GlobalFree(ppi2); - return FALSE; - } - - /* If given buffer too small, set required size and fail... */ - if ((DWORD)lstrlen(ppi2->pPrinterName) >= *pdwBufferSize) - { - *pdwBufferSize = (DWORD)lstrlen(ppi2->pPrinterName) + 1; - GlobalFree(ppi2); - return FALSE; - } - - /* Copy printer name into passed-in buffer... */ - lstrcpy(pPrinterName, ppi2->pPrinterName); - - /* Set buffer size parameter to min required buffer size... */ - *pdwBufferSize = (DWORD)lstrlen(ppi2->pPrinterName) + 1; - } - - /* If Windows NT, use the GetDefaultPrinter API for Windows 2000, - or GetProfileString for version 4.0 and earlier... */ - else if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT) - { -#if(WINVER >= 0x0500) - if (osv.dwMajorVersion >= 5) /* Windows 2000 or later */ - { - bFlag = GetDefaultPrinter(pPrinterName, pdwBufferSize); - if (!bFlag) - return FALSE; - } - - else /* NT4.0 or earlier */ -#endif - { - /* Retrieve the default string from Win.ini (the registry). - String will be in form "printername,drivername,portname". */ - if (GetProfileString("windows", "device", ",,,", cBuffer, MAXBUFFERSIZE) <= 0) - return FALSE; - - /* Printer name precedes first "," character... */ - ptr = cBuffer; - while( *ptr ) - { - if( *ptr == ',' ) - { - *ptr = '\0'; - break; - } - ++ptr; - } - - /* If given buffer too small, set required size and fail... */ - if ((DWORD)lstrlen(cBuffer) >= *pdwBufferSize) - { - *pdwBufferSize = (DWORD)lstrlen(cBuffer) + 1; - return FALSE; - } - - /* Copy printer name into passed-in buffer... */ - lstrcpy(pPrinterName, cBuffer); - - /* Set buffer size parameter to min required buffer size... */ - *pdwBufferSize = (DWORD)lstrlen(cBuffer) + 1; - } - } - - /* Cleanup... */ - if (ppi2) - GlobalFree(ppi2); - - return TRUE; -} - -#endif