int fb_DevPrinterGetOffset( const char *pszDevice ) { FB_FILE *tmp_handle = NULL; int cur = 0; char *pszDev; DEV_LPT_PROTOCOL *lpt_proto; if (!fb_DevLptParseProtocol( &lpt_proto, pszDevice, strlen(pszDevice), TRUE) ) { if( lpt_proto ) free( lpt_proto ); return fb_ErrorSetNum( FB_RTERROR_ILLEGALFUNCTIONCALL ); } pszDev = fb_DevLptMakeDeviceName( lpt_proto ); /* Test all printers. */ tmp_handle = fb_DevLptFindDeviceByName( lpt_proto->iPort, pszDev, TRUE ); if( tmp_handle ) cur = tmp_handle->line_length; if( lpt_proto ) free( lpt_proto ); free(pszDev); return cur; }
int fb_DevPrinterSetWidth( const char *pszDevice, int width, int default_width ) { FB_FILE *tmp_handle = NULL; int cur = ((default_width==-1) ? 80 : default_width); char *pszDev; DEV_LPT_PROTOCOL *lpt_proto; if (!fb_DevLptParseProtocol( &lpt_proto, pszDevice, strlen(pszDevice), TRUE) ) { if( lpt_proto ) free( lpt_proto ); return fb_ErrorSetNum( FB_RTERROR_ILLEGALFUNCTIONCALL ); } pszDev = fb_DevLptMakeDeviceName( lpt_proto ); /* Test all printers. */ tmp_handle = fb_DevLptFindDeviceByName( lpt_proto->iPort, pszDev, TRUE ); if( tmp_handle ) { if( width!=-1 ) tmp_handle->width = width; cur = tmp_handle->width; } if( lpt_proto ) free( lpt_proto ); free(pszDev); return cur; }
int fb_PrinterOpen( DEV_LPT_INFO *devInfo, int iPort, const char *pszDevice ) { int result = fb_ErrorSetNum( FB_RTERROR_OK ); const DEV_PRINTER_EMU_MODE *pFoundEmu = NULL; DWORD dwJob = 0; BOOL fResult; HANDLE hPrinter = NULL; HDC hDc = NULL; char *printer_name = NULL; char *doc_title = NULL; DEV_LPT_PROTOCOL *lpt_proto; if ( !fb_DevLptParseProtocol( &lpt_proto, pszDevice, strlen(pszDevice), TRUE ) ) { if( lpt_proto!=NULL ) free(lpt_proto); return fb_ErrorSetNum( FB_RTERROR_ILLEGALFUNCTIONCALL ); } /* Allow only valid emulation modes */ if( *lpt_proto->emu!=0 ) { int i; for( i=0; i!=sizeof(aEmulationModes)/sizeof(aEmulationModes[0]); ++i ) { const DEV_PRINTER_EMU_MODE *pEmu = aEmulationModes + i; if( strcasecmp( lpt_proto->emu, pEmu->pszId )==0 ) { pFoundEmu = pEmu; break; } } if( !pFoundEmu ) { if( lpt_proto!=NULL ) free(lpt_proto); return fb_ErrorSetNum( FB_RTERROR_ILLEGALFUNCTIONCALL ); } } if( iPort==0 ) { /* LPT:[PrinterName] */ if( *lpt_proto->name ) { printer_name = strdup( lpt_proto->name ); } else { printer_name = GetDefaultPrinterName(); } } else { /* LPTx: */ FB_LIST dev_printer_devs; DEV_PRINTER_DEVICE* node; fb_hListDevInit( &dev_printer_devs ); fb_hPrinterBuildList( &dev_printer_devs ); /* Find printer attached to specified device */ node = fb_hListDevFindDevice( &dev_printer_devs, lpt_proto->proto ); if( node!=NULL ) { printer_name = strdup( node->printer_name ); } fb_hListDevClear( &dev_printer_devs ); } if( printer_name == NULL ) { result = fb_ErrorSetNum( FB_RTERROR_FILENOTFOUND ); } else { if( *lpt_proto->emu!= '\0' ) { /* When EMULATION is used, we have to use the DC instead of * the PRINTER directly */ hDc = CreateDCA( "WINSPOOL", printer_name, NULL, NULL ); fResult = hDc!=NULL; } else { /* User PRINTER directly */ fResult = OpenPrinter(printer_name, &hPrinter, NULL); } if( !fResult ) { result = fb_ErrorSetNum( FB_RTERROR_FILENOTFOUND ); } } if( lpt_proto->title && *lpt_proto->title ) { doc_title = strdup( lpt_proto->title ); } else { doc_title = strdup( "FreeBASIC document" ); } if( result==FB_RTERROR_OK ) { if( *lpt_proto->emu!= '\0' ) { int iJob; DOCINFO docInfo; memset( &docInfo, 0, sizeof(DOCINFO) ); docInfo.cbSize = sizeof(DOCINFO); docInfo.lpszDocName = doc_title; iJob = StartDoc( hDc, &docInfo ); if( iJob <= 0 ) { result = fb_ErrorSetNum( FB_RTERROR_FILEIO ); } else { dwJob = (DWORD) iJob; } } else { DOC_INFO_1 DocInfo; DocInfo.pDocName = doc_title; DocInfo.pOutputFile = NULL; DocInfo.pDatatype = TEXT("RAW"); dwJob = StartDocPrinter( hPrinter, 1, (BYTE*) &DocInfo ); if( dwJob==0 ) { result = fb_ErrorSetNum( FB_RTERROR_FILEIO ); } } } if( result==FB_RTERROR_OK ) { W32_PRINTER_INFO *pInfo = calloc( 1, sizeof(W32_PRINTER_INFO) ); if( pInfo==NULL ) { result = fb_ErrorSetNum( FB_RTERROR_OUTOFMEM ); } else { devInfo->driver_opaque = pInfo; pInfo->hPrinter = hPrinter; pInfo->dwJob = dwJob; pInfo->hDc = hDc; if( hDc!=NULL ) { LOGFONT lf; pInfo->Emu.dwFullSizeX = GetDeviceCaps( hDc, PHYSICALWIDTH ); pInfo->Emu.dwFullSizeY = GetDeviceCaps( hDc, PHYSICALHEIGHT ); pInfo->Emu.dwSizeX = GetDeviceCaps( hDc, HORZRES ); pInfo->Emu.dwSizeY = GetDeviceCaps( hDc, VERTRES ); pInfo->Emu.dwOffsetX = GetDeviceCaps( hDc, PHYSICALOFFSETX ); pInfo->Emu.dwOffsetY = GetDeviceCaps( hDc, PHYSICALOFFSETY ); pInfo->Emu.dwDPI_X = GetDeviceCaps( hDc, LOGPIXELSX ); pInfo->Emu.dwDPI_Y = GetDeviceCaps( hDc, LOGPIXELSY ); #if 0 pInfo->Emu.dwCurrentX = pInfo->Emu.dwOffsetX; pInfo->Emu.dwCurrentY = pInfo->Emu.dwOffsetY; #else pInfo->Emu.dwCurrentX = 0; pInfo->Emu.dwCurrentY = 0; #endif pInfo->Emu.clFore = RGB(0,0,0); pInfo->Emu.clBack = RGB(255,255,255); /* Start in 12 CPI monospace mode */ EmuBuild_LOGFONT( &lf, pInfo, 12 ); /* Should never fail - except when some default fonts were * removed by hand (which is very unlikely) */ pInfo->Emu.hFont = CreateFontIndirect( &lf ); DBG_ASSERT( pInfo->Emu.hFont!=NULL ); /* Register PRINT function */ pInfo->Emu.pfnPrint = pFoundEmu->pfnPrint; /* Should not be necessary because this is the default */ SetTextAlign( hDc, TA_TOP | TA_LEFT | TA_NOUPDATECP ); EmuUpdateInfo( pInfo ); } } } if( result!=FB_RTERROR_OK ) { if( dwJob!=0 ) { if( *lpt_proto->emu != '\0' ) { EndDoc( hDc ); } else { EndDocPrinter( hPrinter ); } } if( hPrinter!=NULL ) { ClosePrinter( hPrinter ); } if( hDc!=NULL ) { DeleteDC( hDc ); } } if( printer_name!=NULL ) free( printer_name ); if( doc_title!=NULL ) free( doc_title ); if( lpt_proto!=NULL ) free(lpt_proto); return result; }
/*:::::*/ int fb_DevLptOpen( FB_FILE *handle, const char *filename, size_t filename_len ) { DEV_LPT_PROTOCOL *lpt_proto; DEV_LPT_INFO *devInfo; FB_FILE *redir_handle = NULL; FB_FILE *tmp_handle = NULL; int res; if (!fb_DevLptParseProtocol( &lpt_proto, filename, filename_len , TRUE) ) { if( lpt_proto ) free( lpt_proto ); return fb_ErrorSetNum( FB_RTERROR_ILLEGALFUNCTIONCALL ); } FB_LOCK(); /* Determine the port number and a normalized device name */ devInfo = (DEV_LPT_INFO*) calloc(1, sizeof(DEV_LPT_INFO)); devInfo->uiRefCount = 1; devInfo->iPort = lpt_proto->iPort; devInfo->pszDevice = fb_DevLptMakeDeviceName( lpt_proto ); devInfo->driver_opaque = NULL; /* Test if the printer is already open. */ tmp_handle = fb_DevLptFindDeviceByName( devInfo->iPort, devInfo->pszDevice, FALSE ); if( tmp_handle ) { free(devInfo); redir_handle = tmp_handle; devInfo = (DEV_LPT_INFO*) tmp_handle->opaque; ++devInfo->uiRefCount; } /* Open the printer if not opened already */ if( devInfo->driver_opaque == NULL ) { res = fb_PrinterOpen( devInfo, devInfo->iPort, filename ); } else { res = fb_ErrorSetNum( FB_RTERROR_OK ); if( FB_HANDLE_USED(redir_handle) ) { /* We only allow redirection between OPEN "LPT1:" and LPRINT */ if( handle==FB_HANDLE_PRINTER ) { redir_handle->redirection_to = handle; handle->width = redir_handle->width; handle->line_length = redir_handle->line_length; } else { handle->redirection_to = redir_handle; } } else { handle->width = 80; } } if( res == FB_RTERROR_OK ) { handle->hooks = &hooks_dev_lpt; handle->opaque = devInfo; handle->type = FB_FILE_TYPE_PRINTER; } else { if( devInfo->pszDevice ) free( devInfo->pszDevice ); free( devInfo ); } if( lpt_proto ) free( lpt_proto ); FB_UNLOCK(); return res; }