2009-11-22 12:43 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)

* contrib/hbwin/win_prn2.c
    + PRINTFILERAW(): Changed to use Harbour File I/O API instead
      of Windows one to read from a disk file.
    * More variable name / macro usage cleanup.

    ! TOFIX: PRINTFILERAW() has suspicious code aiming to delete 
      Chr( 26 ) from input files. In current implementation it can 
      strip Chr( 26 ) even from inside the file if the file is 
      larger than read buffer, which means it will corrupt input 
      and may cause wrong output to be printed (f.e. if that Chr( 26 ) 
      is part of a printer control char sequence).

  * INSTALL
    + Added linux/clang to the target mix.
This commit is contained in:
Viktor Szakats
2009-11-22 11:53:05 +00:00
parent dc9128c46b
commit 2db500ed1c
3 changed files with 39 additions and 23 deletions

View File

@@ -17,6 +17,22 @@
past entries belonging to author(s): Viktor Szakats.
*/
2009-11-22 12:43 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* contrib/hbwin/win_prn2.c
+ PRINTFILERAW(): Changed to use Harbour File I/O API instead
of Windows one to read from a disk file.
* More variable name / macro usage cleanup.
! TOFIX: PRINTFILERAW() has suspicious code aiming to delete
Chr( 26 ) from input files. In current implementation it can
strip Chr( 26 ) even from inside the file if the file is
larger than read buffer, which means it will corrupt input
and may cause wrong output to be printed (f.e. if that Chr( 26 )
is part of a printer control char sequence).
* INSTALL
+ Added linux/clang to the target mix.
2009-11-22 12:38 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
+ harbour/config/linux/clang.mk
+ added support for CLANG in LINUX builds
@@ -33,12 +49,11 @@
TOFIX: now it compiles in Linux and OS2 builds but it still does not
work
2009-11-22 12:29 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* contrib/hbwin/win_prn2.c
* Variables renamed to reflect their types.
* Further cleanups.
+ Added TOFIX to use Harbour IO instead of win to read a disk file.
+ Added TOFIX to use Harbour IO instead of win to read a disk file. [DONE]
* Changed to use HB_SIZE instead of ULONG for string lengths/sizes.
+ Added HB_SIZE casts to silence 64-bit warnings (to two places).

View File

@@ -413,6 +413,7 @@ HARBOUR
linux
-----
gcc - GNU C
clang - Clang compiler frontend
watcom - Open Watcom C++
icc - Intel(R) C/C++
sunpro - Sun Studio C/C++
@@ -420,8 +421,8 @@ HARBOUR
darwin
------
gcc - GNU C
icc - Intel(R) C/C++
clang - Clang compiler frontend
icc - Intel(R) C/C++
bsd
---
@@ -1138,6 +1139,7 @@ HARBOUR
x os2 -> dos/watcom x86
x os2 -> linux/watcom x86
linux -> linux/gcc (CPU cross-builds possible)
linux -> linux/clang (CPU cross-builds possible)
linux -> linux/icc (CPU cross-builds possible: x86, x86-64, ia64)
linux -> linux/sunpro (CPU cross-builds possible: x86, x86-64)
x linux -> wce/mingwarm arm

View File

@@ -64,6 +64,7 @@
#define HB_OS_WIN_USED
#include "hbapi.h"
#include "hbapifs.h"
#include "hbapiitm.h"
#define _ENUMPRN_FLAGS_ ( PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS )
@@ -192,7 +193,6 @@ static BOOL hb_GetDefaultPrinter( char * pszPrinterName, HB_SIZE * pulBufferSize
{
/*
This option should never be required but is included because of this article
http://support.microsoft.com/kb/246772/en-us
This option will not enumerate any network printers.
@@ -210,20 +210,20 @@ static BOOL hb_GetDefaultPrinter( char * pszPrinterName, HB_SIZE * pulBufferSize
{
if( dwNeeded )
{
PRINTER_INFO_2 * ppi2 = ( PRINTER_INFO_2 * ) hb_xgrab( dwNeeded );
PRINTER_INFO_2 * pPrinterInfo = ( PRINTER_INFO_2 * ) hb_xgrab( dwNeeded );
if( EnumPrinters( PRINTER_ENUM_DEFAULT, NULL, 2, ( LPBYTE ) ppi2, dwNeeded, &dwNeeded, &dwReturned ) && dwReturned )
if( EnumPrinters( PRINTER_ENUM_DEFAULT, NULL, 2, ( LPBYTE ) pPrinterInfo, dwNeeded, &dwNeeded, &dwReturned ) && dwReturned )
{
DWORD dwSize = ( DWORD ) lstrlen( ppi2->pPrinterName );
DWORD dwSize = ( DWORD ) lstrlen( pPrinterInfo->pPrinterName );
if( dwSize && dwSize < *pulBufferSize )
{
HB_TCHAR_GETFROM( pszPrinterName, ppi2->pPrinterName, lstrlen( ppi2->pPrinterName ) );
HB_TCHAR_GETFROM( pszPrinterName, pPrinterInfo->pPrinterName, lstrlen( pPrinterInfo->pPrinterName ) );
*pulBufferSize = dwSize + 1;
bResult = TRUE;
}
}
hb_xfree( ppi2 );
hb_xfree( pPrinterInfo );
}
}
}
@@ -425,8 +425,6 @@ HB_FUNC( PRINTERPORTTONAME )
hb_retc_null();
}
#define BIG_PRINT_BUFFER ( 1024 * 32 )
static int hb_PrintFileRaw( const char * pszPrinterName, const char * pszFileName, const char * pszDocName )
{
HANDLE hPrinter;
@@ -444,26 +442,27 @@ static int hb_PrintFileRaw( const char * pszPrinterName, const char * pszFileNam
{
if( StartPagePrinter( hPrinter ) != 0 )
{
LPTSTR lpFileName = HB_TCHAR_CONVTO( pszFileName );
/* TOFIX: Use Harbour FS API */
HANDLE hFile = CreateFile( lpFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
HB_FHANDLE fhnd = hb_fsOpen( pszFileName, FO_READ | FO_SHARED );
HB_TCHAR_FREE( lpFileName );
if( hFile != INVALID_HANDLE_VALUE )
if( fhnd != FS_ERROR )
{
BYTE printBuffer[ BIG_PRINT_BUFFER ];
DWORD nRead, nWritten = 0;
BYTE pbyBuffer[ 32 * 1024 ];
DWORD nWritten = 0;
USHORT nRead;
while( ReadFile( hFile, printBuffer, sizeof( printBuffer ), &nRead, NULL ) && nRead > 0 )
while( ( nRead = hb_fsRead( fhnd, pbyBuffer, sizeof( pbyBuffer ) ) ) > 0 )
{
if( printBuffer[ nRead - 1 ] == 26 )
/* TOFIX: This check seems wrong for any input files
larger than our read buffer, in such case it
will strip Chr( 26 ) from inside the file, which
means it will corrupt it. [vszakats] */
if( pbyBuffer[ nRead - 1 ] == 26 )
nRead--; /* Skip the EOF() character */
WritePrinter( hPrinter, printBuffer, nRead, &nWritten );
WritePrinter( hPrinter, pbyBuffer, nRead, &nWritten );
}
iResult = 1;
CloseHandle( hFile );
hb_fsClose( fhnd );
}
else
iResult = -6;