2020-09-30 17:12:29 +02:00

595 lines
19 KiB
C

//---------------------------------------------------------------------------
// FILE: PRTEXP.C
//
// DESCRIPTION: This file contains the exported functions that do the
// printing and the immediate internal functions they call.
//
// EXPORTED FUNCTIONS: IMGPrtFiles
//
// INTERNAL FUNCTIONS: IMGFaxFilesFx
// IMGFaxFileFx
//
/* $Log: S:\products\wangview\oiwh\print\prtexp.c_v $
*
* Rev 1.32 17 Apr 1996 10:10:28 RC
* Ifdefd out contrast and brightness calls for this release
*
* Rev 1.31 19 Jan 1996 14:12:18 RC
* Added setparm to set the brightness and contrast values of the window
* before calling into display
*
* Rev 1.30 28 Nov 1995 10:41:38 RAR
* Added code to build jobname string for passed in jobname.
* 'Print **** (3 pages)' where **** is the jobname
*
* Rev 1.29 21 Sep 1995 17:19:24 RAR
* Disable scroll bars on hidden window.
*
* Rev 1.28 15 Sep 1995 14:40:32 RAR
* Removed printing method of reading from display and only print by passing
* display a DC to print to.
*
* Rev 1.27 13 Sep 1995 17:34:02 RAR
* Removed unnecessary code.
*
* Rev 1.26 12 Sep 1995 15:54:02 RAR
* Replaced IMGFileGetInfo calls with IMGGetParmsCgbw because we are now getting
* our image data through the display DLL and should also get the image
* parameters through it.
*
* Rev 1.25 11 Sep 1995 11:06:18 RAR
* Slight code restructuring to make more readable.
*
* Rev 1.24 09 Sep 1995 09:37:10 RAR
* Changed code to not read data with filing calls but read from display instead
* so cache will be utilized.
*
* Rev 1.23 06 Sep 1995 13:16:48 RAR
* Calculate vertical pixels of AWD files by reading in data because number
* returned from file info call may not be correct.
*
* Rev 1.22 05 Sep 1995 12:12:10 RAR
* Fixed problem where list of files to print passed to IMGPrtFiles contains
* annotated images followed by non-annotated images and the non-annotated
* images come out blank. When printing the non-annotated images, the code was
* passing the apps window handle on a file open call and passing the handle
* of a hidden window (used for annotated images) on file read calls.
*
* Rev 1.21 24 Aug 1995 16:23:22 RAR
* Get buffer size from filing functions to use for AWD file reads so data won't
* overflow the buffer.
*
* Rev 1.20 14 Jul 1995 15:34:28 RAR
* Changed #include of display.h to engdisp.h.
*
* Rev 1.19 07 Jul 1995 10:37:28 RAR
* Use Windows function IsBadStringPtr instead of my own function.
*
* Rev 1.18 28 Jun 1995 15:16:52 RAR
* Removed hWnd param from internal function InitPrt. Also, return error from
* function IMGPrtFiles when hWnd param is zero because filing functions need
* a valid window handle.
*
* Rev 1.17 28 Jun 1995 14:23:20 RAR
* Fixed print error codes.
*
* Rev 1.16 23 Jun 1995 16:03:40 RAR
* Implemented using passed in job name.
*
* Rev 1.15 23 Jun 1995 14:42:56 RAR
* Added checking validity of passed in string pointers.
*
* Rev 1.14 23 Jun 1995 09:45:40 RAR
* Protection against simultaneous access of shared data by multiple threads and
* multiple processes.
*
* Rev 1.13 21 Jun 1995 16:17:44 RAR
* Moved all global vars to prtintl.h.
*
* Rev 1.12 20 Jun 1995 10:14:10 RAR
* Use IMGSavetoFileEx instead of SavetoFileCgbwF.
*
* Rev 1.11 16 Jun 1995 14:10:38 RAR
* Changed MAXFILESPECLENGTH to MAX_PATH.
*
* Rev 1.10 15 Jun 1995 10:00:26 RAR
* Implemented passed in printer through DESTPRINTER struct.
*
* Rev 1.9 13 Jun 1995 16:46:00 RAR
* Print options are now stored in static mem rather than associated with window
* handle. Changed function interfaces to accept printer destination in
* IMGPrtFiles, IMGPrtImage, and IMGPrtWindow and removed window handle param in
* OiPrtGetOpts and OiPrtSetOpts.
*
* Rev 1.8 24 May 1995 15:37:28 RAR
* Changed to the new filing functions.
*
* Rev 1.7 22 May 1995 14:42:04 RAR
* Cleaned up the string resources.
*
* Rev 1.6 16 May 1995 16:19:16 RAR
* Added support for printing annotated images without the annotations.
*
* Rev 1.5 15 May 1995 13:40:28 RAR
* Removed some commented out code.
*
* Rev 1.4 11 May 1995 13:37:32 RAR
* Changed some function params.
*
* Rev 1.3 04 May 1995 17:19:20 RAR
* Removed #include of wiissubs.h.
*
* Rev 1.2 02 May 1995 10:32:10 RAR
* Implemented print table to replace print items in CM table.
*
* Rev 1.1 27 Apr 1995 16:12:40 RAR
* Added new structs to specify file pages to print.
*
* Rev 1.0 25 Apr 1995 17:00:46 RAR
* Initial entry
*/
//---------------------------------------------------------------------------
#include <windows.h>
#include <string.h>
#include "oiprt.h"
#include "prtintl.h"
#include "prtstubs.h"
#include "prtstr.h"
#include "oidisp.h"
#include "privapis.h"
#include "engdisp.h"
#include "oiadm.h"
//---------------------------------------------------------------------------
// FUNCTION: IMGPrtFiles
//
// DESCRIPTION: Exported function that prints a list of files.
//---------------------------------------------------------------------------
int __stdcall IMGPrtFiles(HWND hWnd, PFILELIST pFileList, PPRTPARAMS pParams, PDESTPRINTER pPrinter)
{
int nStatus = 0;
int i;
PrtStart();
if (!IsWindow(hWnd))
{
nStatus = PrtError(OIPRT_BADWINDOWHNDL);
goto Exit;
}
if (IsBadReadPtr(pFileList, sizeof (FILELIST)))
{
nStatus = PrtError(OIPRT_BADPTRPARAM);
goto Exit;
}
if (IsBadReadPtr(pFileList->pFileDef,
pFileList->uFileCount * sizeof (FILEDEF)))
{
nStatus = PrtError(OIPRT_BADPTRPARAM);
goto Exit;
}
for (i = 0; i < (int)pFileList->uFileCount; i++)
{
if (nStatus = IsBadStringPtr(pFileList->pFileDef[i].pFilePath,
MAX_PATH))
goto Exit;
}
if (IsBadReadPtr(pParams, sizeof (PRTPARAMS)))
{
nStatus = PrtError(OIPRT_BADPTRPARAM);
goto Exit;
}
if (pParams->pJobName && (nStatus = IsBadStringPtr(pParams->pJobName,
MAX_PATH)))
goto Exit;
if (pPrinter)
{
if (IsBadReadPtr(pPrinter, sizeof (DESTPRINTER)))
{
nStatus = PrtError(OIPRT_BADPTRPARAM);
goto Exit;
}
if (pPrinter->lpszDriver && (nStatus =
IsBadStringPtr((PSTR)pPrinter->lpszDriver, MAX_PATH)))
goto Exit;
if (pPrinter->lpszDevice && (nStatus =
IsBadStringPtr((PSTR)pPrinter->lpszDevice, MAX_PATH)))
goto Exit;
if (pPrinter->lpszOutput && (nStatus =
IsBadStringPtr((PSTR)pPrinter->lpszOutput, MAX_PATH)))
goto Exit;
}
if (pFileList->nVersion != FILELISTVERSION)
{
nStatus = PrtError(OIPRT_BADSTRUCTVERSION);
goto Exit;
}
if (pParams->nVersion != PRTPARAMSVERSION)
{
nStatus = PrtError(OIPRT_BADSTRUCTVERSION);
goto Exit;
}
if (pPrinter && pPrinter->nVersion != DESTPRINTERVERSION)
{
nStatus = PrtError(OIPRT_BADSTRUCTVERSION);
goto Exit;
}
nStatus = IMGFaxFilesFx(hWnd, pParams, pFileList, pPrinter);
Exit:
PrtEnd();
return nStatus;
}
//---------------------------------------------------------------------------
// FUNCTION: IMGFaxFilesFx
//
// DESCRIPTION: Internal function that faxes or prints a list of files.
//---------------------------------------------------------------------------
int __stdcall IMGFaxFilesFx(HWND hWnd, PPRTPARAMS pParams, PFILELIST pFileList, PDESTPRINTER pPrinter)
{
int nStatus = 0;
PFILEDEF pFileDef;
WORD wFaxMode;
FIO_INFORMATION fileInfo;
UINT uStartPage;
UINT uEndPage;
UINT uTotalPageCount = 0;
UINT i;
HANDLE hPrtOpts = NULL;
PPRTOPTS pPrtOpts = NULL;
PrtStart();
pFileDef = pFileList->pFileDef;
if (!(hPrtOpts = GlobalAlloc(GHND, sizeof (PRTOPTS))))
{
nStatus = PrtError(OIPRT_OUTOFMEMORY);
goto Exit;
}
if (!(pPrtOpts = (PPRTOPTS)GlobalLock(hPrtOpts)))
{
nStatus = PrtError(OIPRT_OUTOFMEMORY);
goto Exit;
}
pPrtOpts->nVersion = PRTOPTSVERSION;
if (nStatus = OiPrtGetOpts(pPrtOpts))
{
PrtError(nStatus);
goto Exit;
}
for (i = 0; i < pFileList->uFileCount; i++)
{
uStartPage = pFileDef[i].uStartPage;
uEndPage = pFileDef[i].uEndPage;
if (uStartPage == 0)
uStartPage = 1;
// Adjust nEndPage for "all pages" case.
if (uEndPage == 0)
{
fileInfo.page_number = 0;
fileInfo.filename = pFileDef[i].pFilePath;
if (nStatus = IMGFileGetInfo(NULL, hWnd, &fileInfo, NULL, NULL))
{
if (nStatus == FIO_NO_IMAGE_LENGTH)
nStatus = 0;
else
{
PrtError(nStatus);
goto Exit;
}
}
uEndPage = fileInfo.page_count;
}
if (uStartPage > uEndPage)
{
nStatus = PrtError(OIPRT_PAGEOUTOFRANGE);
goto Exit;
}
uTotalPageCount += uEndPage - uStartPage + 1;
}
for (i = 0; i < pFileList->uFileCount; i++)
{
wFaxMode = SetFaxOption(pFileList->uFileCount, i);
if (nStatus = IMGFaxFileFx(hWnd, NULL, pFileDef[i].pFilePath, pFileDef[i].uStartPage,
pFileDef[i].uEndPage, pParams->nFormat, wFaxMode, uTotalPageCount, pPrinter, pPrtOpts,
pParams->pJobName))
{
PrtError(nStatus);
goto Exit;
}
}
Exit:
if (hPrtOpts)
{
GlobalUnlock(hPrtOpts);
GlobalFree(hPrtOpts);
}
PrtEnd();
return nStatus;
}
//---------------------------------------------------------------------------
// FUNCTION: IMGFaxFileFx
//
// DESCRIPTION: Internal function that faxes or prints a single file.
//---------------------------------------------------------------------------
int __stdcall IMGFaxFileFx(HWND hWnd, LPRECT lpRect, LPSTR lpFileName, int nStartPage, int nEndPage,
UINT uOutSize, WORD wFaxOrPrint, UINT uTotalPageCount, PDESTPRINTER pPrinter, PPRTOPTS pPrtOpts,
PSTR pJobName)
{
int nStatus = 0;
char szMsg[LOADSTRLEN2];
char szMsgTmp[LOADSTRLEN2];
int nIndex,i;
LPSTR lptmp;
HANDLE hPage = 0;
PRTPAGEINFO* lpPage;
UINT uPrtDest;
HWND hWndAnnotate = (HWND)0; // Create a window for annotated files, 3.7
HWND hWndPrint = hWnd; // Working window handle
BOOL bUseDisplay = FALSE;
LPSTR lpOutMsg;
char szNetPrtDest[MAX_PATH];
PrtStart();
if ((nStartPage < 0) || (nEndPage < 0))
{
nStatus = PrtError(OIPRT_PAGEOUTOFRANGE);
return nStatus;
}
if (nStartPage == 0)
nStartPage = 1;
if (nStatus = InitPrt(&uOutSize, &uPrtDest, szNetPrtDest, pPrtOpts))
return nStatus;
/* Begin DBCS Enable */
/* DBCS_enable_point */
i = 0;
lptmp = lpFileName;
while (lpFileName[i])
{
if (IsDBCSLeadByte(lpFileName[i]))
i++;
else if (lpFileName[i] == '\\')
lptmp = &lpFileName[i+1];
i++;
} /* End DBCS Enable */
// Allocate and setup the PRTPAGEINFO structure.
if (!(hPage = GlobalAlloc(GHND, (DWORD)sizeof(PRTPAGEINFO))))
{
nStatus = PrtError(OIPRT_OUTOFMEMORY);
goto Exit;
}
if (!(lpPage = (PRTPAGEINFO*)GlobalLock(hPage)))
{
nStatus = PrtError(OIPRT_OUTOFMEMORY);
goto Exit;
}
nIndex = nStartPage;
/******************** Start of Loop *********************************/
do
{ // always execute this atleast once in order to setup nEndPage.
bUseDisplay = TRUE;
// Need to use hidden window, to display file, and save it to a
if (!hWndAnnotate && !(hWndAnnotate = CreateHiddenWndw(hWnd)))
{
nStatus = PrtError(OIPRT_CANTCREATEWNDW);
goto Exit;
}
hWndPrint = hWndAnnotate;
if (nStatus = IMGDisplayFile(hWndPrint, lpFileName, (WORD)nIndex, OI_DISP_NO | OI_NOSCROLL))
{
nStatus = PrtError(nStatus);
goto Exit;
}
if (nStatus = IMGGetParmsCgbw(hWndPrint, PARM_IMGPARMS, (void*)&lpPage->dispParams, 0))
{
nStatus = PrtError(nStatus);
goto Exit;
}
// Adjust nEndPage for "all pages" case.
if (nEndPage == 0)
nEndPage = lpPage->dispParams.total_num_pages;
if (nStartPage > nEndPage || nEndPage > lpPage->dispParams.total_num_pages)
{
nStatus = PrtError(OIPRT_PAGEOUTOFRANGE);
goto Exit;
}
// Now we can build the dialog box title (first time only)
// We couldn't before because nEndPage may have been wrong
if (nIndex == nStartPage)
{
memset(szMsg, 0, LOADSTRLEN2);
memset(szMsgTmp, 0, LOADSTRLEN2);
LoadString(hInst, IDS_PRINT, szMsg, LOADSTRLEN2);
if (pJobName)
strncat(szMsg, pJobName, LOADSTRLEN2 - strlen(szMsg) - 1);
else
strncat(szMsg, lptmp, LOADSTRLEN2 - strlen(szMsg) - 1);
if (uTotalPageCount)
{
if (uTotalPageCount == 1)
{
strncat(szMsg, " (1 ", LOADSTRLEN2 - strlen(szMsg) - 1);
LoadString(hInst, IDS_1PAGE, szMsgTmp, LOADSTRSMALL);
strncat(szMsg, szMsgTmp, LOADSTRLEN2 - strlen(szMsg) - 1);
strncat(szMsg, ")", LOADSTRLEN2 - strlen(szMsg) - 1);
}
else
{
strncat(szMsg, " (", LOADSTRLEN2 - strlen(szMsg) - 1);
_ultoa(uTotalPageCount, szMsgTmp, 10);
strncat(szMsg, szMsgTmp, LOADSTRLEN2 - strlen(szMsg) - 1);
strncat(szMsg, " ", LOADSTRLEN2 - strlen(szMsg) - 1);
LoadString(hInst, IDS_NPAGE, szMsgTmp, LOADSTRSMALL);
strncat(szMsg, szMsgTmp, LOADSTRLEN2 - strlen(szMsg) - 1);
strncat(szMsg, ")", LOADSTRLEN2 - strlen(szMsg) - 1);
}
}
else if (nStartPage >= nEndPage)
{
if (nStartPage == 1)
{
strncat(szMsg, " (1 ", LOADSTRLEN2 - strlen(szMsg) - 1);
LoadString(hInst, IDS_1PAGE, szMsgTmp, LOADSTRSMALL);
strncat(szMsg, szMsgTmp, LOADSTRLEN2 - strlen(szMsg) - 1);
strncat(szMsg, ")", LOADSTRLEN2 - strlen(szMsg) - 1);
}
else
{
strncat(szMsg, " (", LOADSTRLEN2 - strlen(szMsg) - 1);
LoadString(hInst, IDS_1PAGE, szMsgTmp, LOADSTRSMALL);
strncat(szMsg, szMsgTmp, LOADSTRLEN2 - strlen(szMsg) - 1);
strncat(szMsg, " ", LOADSTRLEN2 - strlen(szMsg) - 1);
_itoa(nStartPage, szMsgTmp, 10);
strncat(szMsg, szMsgTmp, LOADSTRLEN2 - strlen(szMsg) - 1);
strncat(szMsg, ")", LOADSTRLEN2 - strlen(szMsg) - 1);
}
}
else
{
if (nStartPage == 1)
{
strncat(szMsg, " (", LOADSTRLEN2 - strlen(szMsg) - 1);
_itoa(nEndPage - nStartPage + 1, szMsgTmp, 10);
strncat(szMsg, szMsgTmp, LOADSTRLEN2 - strlen(szMsg) - 1);
strncat(szMsg, " ", LOADSTRLEN2 - strlen(szMsg) - 1);
LoadString(hInst, IDS_NPAGE, szMsgTmp, LOADSTRSMALL);
strncat(szMsg, szMsgTmp, LOADSTRLEN2 - strlen(szMsg) - 1);
strncat(szMsg, ")", LOADSTRLEN2 - strlen(szMsg) - 1);
}
else
{
strncat(szMsg, " (", LOADSTRLEN2 - strlen(szMsg) - 1);
LoadString(hInst, IDS_NPAGE, szMsgTmp, LOADSTRSMALL);
strncat(szMsg, szMsgTmp, LOADSTRLEN2 - strlen(szMsg) - 1);
strncat(szMsg, " ", LOADSTRLEN2 - strlen(szMsg) - 1);
_itoa(nStartPage, szMsgTmp, 10);
strncat(szMsg, szMsgTmp, LOADSTRLEN2 - strlen(szMsg) - 1);
LoadString(hInst, IDS_TO, szMsgTmp, LOADSTRSMALL);
strncat(szMsg, szMsgTmp, LOADSTRLEN2 - strlen(szMsg) - 1);
_itoa(nEndPage, szMsgTmp, 10);
strncat(szMsg, szMsgTmp, LOADSTRLEN2 - strlen(szMsg) - 1);
strncat(szMsg, ")", LOADSTRLEN2 - strlen(szMsg) - 1);
}
} // end else of if (startpage is less than or equal to endpage)
} // end if index equates to startpage
if (lpRect == NULL)
{
lpPage->Rect.left = lpPage->Rect.top = 0;
lpPage->Rect.right = lpPage->dispParams.width_in_pixels;
lpPage->Rect.bottom = lpPage->dispParams.height_in_pixels;
lpPage->xSize = lpPage->dispParams.width_in_pixels;
lpPage->ySize = lpPage->dispParams.height_in_pixels;
}
else
{
lpPage->Rect = *lpRect;
if (lpPage->Rect.left > lpPage->Rect.right || lpPage->Rect.top > lpPage->Rect.bottom ||
lpPage->Rect.left < 0 || lpPage->Rect.top < 0 ||
lpPage->Rect.right > lpPage->dispParams.width_in_pixels ||
lpPage->Rect.bottom > lpPage->dispParams.height_in_pixels)
{
nStatus = PrtError(OIPRT_RECTOUTOFRANGE);
goto Exit;
}
lpPage->xSize = lpPage->Rect.right - lpPage->Rect.left;
lpPage->ySize = lpPage->Rect.bottom - lpPage->Rect.top;
}
lpPage->infoextra1 = hWnd;
// set up for the document paramater of STARTDOC
lpOutMsg = (LPSTR)szMsg;
if (nStatus = PrtAPage(hWndPrint, (WORD)uOutSize, lpPage, lpOutMsg, nIndex, pPrinter, pPrtOpts))
{
PrtError(nStatus);
goto Exit;
}
nIndex++; // Next page
} while (nIndex <= nEndPage);
Exit:
if (lpPage->hBitmapInfo)
{
GlobalUnlock(lpPage->hBitmapInfo);
GlobalFree(lpPage->hBitmapInfo);
}
if (hPage)
{
GlobalUnlock(hPage);
GlobalFree(hPage);
}
BusyOff();
if (nStatus || wFaxOrPrint & PRINT_IT_LAST)
PrtRemoveDC(hWnd, nStatus, pPrtOpts);
if (hWndAnnotate) // delete the hidden window, FaxImageFx does else
{
IMGDeRegWndw(hWndAnnotate);
DestroyWindow(hWndAnnotate);
}
PrtEnd();
return nStatus;
}