BOOL DevQueryPrintEx( PDEVQUERYPRINT_INFO pDQPInfo ) /*++ Routine Description: This routine determines whether or not the driver can print the job described by pDevMode on the printer described by hPrinter Arguments: pDQPInfo - Pointer to DEVQUERYPRINT_INFO data structure typedef struct _DEVQUERYPRINT_INFO { WORD cbSize; // size of this structure in bytes WORD Level; // Level of this info, 1 for this version HANDLE hPrinter; // handle to the printer for the query DEVMODE *pDevMode; // pointer to the DEVMODE for this job. LPTSTR pszErrorStr; // pointer to the error string buffer. WORD cchErrorStr; // count characters of pszErrorStr passed. WORD cchNeeded; // count characters of pszErrorStr needed. } DEVQUERYPRINT_INFO, *PDEVQUERYPRINT_INFO; cbSize - size of this structure Level - This must be one (1) for this version of structure hPrinter - Identifies the printer on which the job is to be printed. pDevMode - Points to the DEVMODE structure that describes the print job that is to be determined as printable or non-printable by hPrinter. The driver should always validate the DEVMODE structure whenever it is passed in. pszErrorStr - This is the pointer to a null terminated unicode string which to stored the reason for non-printable job. If the job is printable then it return TRUE. If the job is non-printable then it return FALSE, and a null terminated unicode string pointed by the pszErrorStr for the reason by this job is not printable. The size of this buffer in characters is specified by the cchErrorStr. cchErrorStr - Specified the size of pszErrorStr in characters (includs null terminator) when calling this function. If an error string is returned due to the non-printable job (returned FALSE), the driver will set ccchNeeded to the total characters (includes null terminator) required for the pszErrorStr, in this case the driver must always truncate the error string to fit into the pwErrorStr (only if it is not NULL) passed up to the cchErrorStr characters passed. cchNeeded - When driver returned FALSE, it specified total characters required for the pszErrorStr. If cchNeeded returned from the driver is larger then the cchErrorStr then it indicate the passed pszErrorStr is too small to hold the full error string, in this case the driver must always truncate the error string to fit into the pszErrorStr passed up to the cchErrorStr size. Return Value: BOOLEAN - TRUE - The job is printable and should not be hold. FALSE - The job is not printable and cchNeeded in the DEVQUERYPRINT_INFO data structure specified total characters required for the pszErrorStr. If returned cchNeeded is greater then cchErrorStr passed then it indicated that pszErrorStr is too small for storing the error string, in this case the driver must always truncate the error string to fit into the pszErrorStr passed, up to the cchErrorStr characters. *Note* The driver should have some predefined generic resource error strings for some possible known errors. such as memroy allocation error, data file not found, invalid devmode,... for returning non devmode related errors. The caller can pre-allocated larger buffer (such as 256 wchars) for storing the error string rather than calling this function twice. Author: 07-Feb-1996 Wed 20:37:31 created -by- Daniel Chou (danielc) Revision History: --*/ { PPRINTERINFO pPI = NULL; LONG ErrorResID = 0; static WCHAR wFormat1[] = L"<%s> %!"; // // if it passed a NULL DEVMODE then we just honor it to said can print // pDQPInfo->cchNeeded = 0; ErrorResID = IDS_FORM_NOT_AVAI; if (!pDQPInfo->pDevMode) { PLOTWARN(("DevQueryPrint: No DEVMODE passed, CANNOT PRINT")); ErrorResID = IDS_INVALID_DATA; } else if (!(pPI = MapPrinter(pDQPInfo->hPrinter, (PPLOTDEVMODE)pDQPInfo->pDevMode, (LPDWORD)&ErrorResID, MPF_DEVICEDATA))) { // // The MapPrinter will allocate memory, set default devmode, reading // and validating the GPC then update from current pritner registry, // PLOTRIP(("DevQueryPrint: MapPrinter() failed")); } else if (pPI->dmErrBits & (USER_PAPER | DM_FORMNAME)) { // // We encounter some errors, and the form has been set to default // PLOTWARN(("DevQueryPrint: CAN'T PRINT, dmErrBits=%08lx (PAPER/FORM)", pPI->dmErrBits)); } else if ((pPI->PlotDM.dm.dmFields & DM_FORMNAME) && (wcscmp(pPI->CurPaper.Name, pPI->PlotDM.dm.dmFormName) == 0)) { // // We can print this form now // ErrorResID = 0; PLOTDBG(DBG_DEVQPRINT, ("DevQueryPrint: Match FormName=%s", pPI->PlotDM.dm.dmFormName)); } else if ((!pPI->CurPaper.Size.cy) || (((pPI->PlotDM.dm.dmFields & USER_PAPER) == USER_PAPER) && (pPI->PlotDM.dm.dmPaperSize == DMPAPER_USER)) || (pPI->PPData.Flags & PPF_SMALLER_FORM)) { LONG lTmp; SIZEL szl; BOOL VarLenPaper; // // 1. If we have ROLL PAPER Installed OR // 2. User Defined Paper Size // 3. User said OK to print smaller form then installed one // // THEN we want to see if it can fit into the device installed form // szl.cx = DMTOSPL(pPI->PlotDM.dm.dmPaperWidth); szl.cy = DMTOSPL(pPI->PlotDM.dm.dmPaperLength); if (VarLenPaper = (BOOL)!pPI->CurPaper.Size.cy) { pPI->CurPaper.Size.cy = pPI->pPlotGPC->DeviceSize.cy; } PLOTDBG(DBG_DEVQPRINT, ("DevQueryPrint: CurPaper=%ldx%ld, Req=%ldx%ld, VarLen=%ld", pPI->CurPaper.Size.cx, pPI->CurPaper.Size.cy, szl.cx, szl.cy, VarLenPaper)); // // One of Following conditions met in that sequence then we can print // the form on loaded paper // // 1. Same size (PORTRAIT or LANDSCAPE) // 2. Larger Size (PORTRAIT or LANDSCAPE) AND // Not a variable length paper AND // PPF_SAMLLER_FORM flag set // if ((pPI->CurPaper.Size.cx < szl.cx) || (pPI->CurPaper.Size.cy < szl.cy)) { // // Swap this so we can do one easier comparsion later // SWAP(szl.cx, szl.cy, lTmp); } if ((pPI->CurPaper.Size.cx >= szl.cx) && (pPI->CurPaper.Size.cy >= szl.cy)) { if ((!VarLenPaper) && (!(pPI->PPData.Flags & PPF_SMALLER_FORM)) && ((pPI->CurPaper.Size.cx > szl.cx) || (pPI->CurPaper.Size.cy > szl.cy))) { PLOTDBG(DBG_DEVQPRINT, ("DevQueryPrint: CAN'T PRINT: user DO NOT want print on larger paper")); } else { PLOTDBG(DBG_DEVQPRINT, ("DevQueryPrint: Paper Size FITS in DEVICE, %ld x %ld", szl.cx, szl.cy)); ErrorResID = 0; } } else { DQPsprintf((HINSTANCE)hPlotUIModule, pDQPInfo->pszErrorStr, pDQPInfo->cchErrorStr, &(pDQPInfo->cchNeeded), wFormat1, pPI->PlotDM.dm.dmFormName, IDS_FORM_TOO_BIG); PLOTDBG(DBG_DEVQPRINT, ("DevQueryPrint: CAN'T PRINT: Form Size too small")); } } PLOTDBG(DBG_DEVQPRINT, ("DevQueryPrint: %s PRINT %s", (ErrorResID) ? "CAN'T" : "OK to", pPI->PlotDM.dm.dmFormName)); if ((!pDQPInfo->cchNeeded) && (ErrorResID)) { switch (ErrorResID) { case IDS_FORM_NOT_AVAI: DQPsprintf((HINSTANCE)hPlotUIModule, pDQPInfo->pszErrorStr, pDQPInfo->cchErrorStr, &(pDQPInfo->cchNeeded), wFormat1, pPI->PlotDM.dm.dmFormName, IDS_FORM_NOT_AVAI); break; default: DQPsprintf((HINSTANCE)hPlotUIModule, pDQPInfo->pszErrorStr, pDQPInfo->cchErrorStr, &(pDQPInfo->cchNeeded), L"%!", ErrorResID); break; } } // // Unget the printer GPC mapping if we got one // if (pPI) { UnMapPrinter(pPI); } return((!ErrorResID) && (!pDQPInfo->cchNeeded)); }
BOOL WINAPI DevQueryPrint( HANDLE hPrinter, DEVMODE *pDM, DWORD *pdwErrIDS ) /*++ Routine Description: This routine determines whether or not the driver can print the job described by pDevMode on the printer described by hPrinter. If if can, it puts zero into pdwErrIDS. If it cannot, it puts the resource id of the string describing why it could not. Arguments: hPrinter - Handle to the printer to be checked pDM - Point to the DEVMODE passed in pdwErrIDS - Point the the DWORD to received resource string ID number for the error. Return Value: This routine returns TRUE for success, FALSE for failure. when it return TRUE, the *pdwErrIDS determine if it can print or not, if *pdwErrIDS == 0, then it can print else it contains the string ID for the reason why it can not print. Author: 07-Dec-1993 Tue 00:50:32 created -by- Daniel Chou (danielc) 14-Jun-1994 Tue 22:43:36 updated -by- Daniel Chou (danielc) Make installed RollPaper always print if the size is reasonable Revision History: --*/ { PPRINTERINFO pPI = NULL; // // if it passed a NULL DEVMODE then we just honor it to said can print // if (!pDM) { PLOTWARN(("DevQueryPrint: No DEVMODE passed, CANNOT PRINT")); *pdwErrIDS = IDS_INV_DMSIZE; return(TRUE); } if (!(pPI = MapPrinter(hPrinter, (PPLOTDEVMODE)pDM, pdwErrIDS, MPF_DEVICEDATA))) { // // The MapPrinter will allocate memory, set default devmode, reading // and validating the GPC then update from current pritner registry, // PLOTRIP(("DevQueryPrint: MapPrinter() failed")); return(TRUE); } // // Assume this error // *pdwErrIDS = IDS_FORM_NOT_AVAI; if (pPI->dmErrBits & (USER_PAPER | DM_FORMNAME)) { // // We encounter some errors, and the form has been set to default // PLOTWARN(("DevQueryPrint: CAN'T PRINT, dmErrBits=%08lx (PAPER/FORM)", pPI->dmErrBits)); } else if ((pPI->PlotDM.dm.dmFields & DM_FORMNAME) && (wcscmp(pPI->CurPaper.Name, pPI->PlotDM.dm.dmFormName) == 0)) { // // We can print this form now // *pdwErrIDS = 0; PLOTDBG(DBG_DEVQPRINT, ("DevQueryPrint: Match FormName=%s", pPI->PlotDM.dm.dmFormName)); } else if ((!pPI->CurPaper.Size.cy) || (((pPI->PlotDM.dm.dmFields & USER_PAPER) == USER_PAPER) && (pPI->PlotDM.dm.dmPaperSize == DMPAPER_USER)) || (pPI->PPData.Flags & PPF_SMALLER_FORM)) { LONG lTmp; SIZEL szl; BOOL VarLenPaper; // // 1. If we have ROLL PAPER Installed OR // 2. User Defined Paper Size // 3. User said OK to print smaller form then installed one // // THEN we want to see if it can fit into the device installed form // szl.cx = DMTOSPL(pPI->PlotDM.dm.dmPaperWidth); szl.cy = DMTOSPL(pPI->PlotDM.dm.dmPaperLength); if (VarLenPaper = (BOOL)!pPI->CurPaper.Size.cy) { pPI->CurPaper.Size.cy = pPI->pPlotGPC->DeviceSize.cy; } PLOTDBG(DBG_DEVQPRINT, ("DevQueryPrint: CurPaper=%ldx%ld, Req=%ldx%ld, VarLen=%ld", pPI->CurPaper.Size.cx, pPI->CurPaper.Size.cy, szl.cx, szl.cy, VarLenPaper)); // // One of Following conditions met in that sequence then we can print // the form on loaded paper // // 1. Same size (PORTRAIT or LANDSCAPE) // 2. Larger Size (PORTRAIT or LANDSCAPE) AND // Not a variable length paper AND // PPF_SAMLLER_FORM flag set // if ((pPI->CurPaper.Size.cx < szl.cx) || (pPI->CurPaper.Size.cy < szl.cy)) { // // Swap this so we can do one easier comparsion later // SWAP(szl.cx, szl.cy, lTmp); } if ((pPI->CurPaper.Size.cx >= szl.cx) && (pPI->CurPaper.Size.cy >= szl.cy)) { if ((!VarLenPaper) && (!(pPI->PPData.Flags & PPF_SMALLER_FORM)) && ((pPI->CurPaper.Size.cx > szl.cx) || (pPI->CurPaper.Size.cy > szl.cy))) { PLOTDBG(DBG_DEVQPRINT, ("DevQueryPrint: CAN'T PRINT: user DO NOT want print on larger paper")); } else { PLOTDBG(DBG_DEVQPRINT, ("DevQueryPrint: Paper Size FITS in DEVICE, %ld x %ld", szl.cx, szl.cy)); *pdwErrIDS = 0; } } else { PLOTDBG(DBG_DEVQPRINT, ("DevQueryPrint: CAN'T PRINT: Form Size too small")); } } PLOTDBG(DBG_DEVQPRINT, ("DevQueryPrint: %s PRINT %s", (*pdwErrIDS) ? "CAN'T" : "OK to", pPI->PlotDM.dm.dmFormName)); // // Unget the printer GPC mapping if we got one // UnMapPrinter(pPI); return(TRUE); }
SHORT GetDefaultPaper( PPAPERINFO pPaperInfo ) /*++ Routine Description: This function compute the default paper name, size. Arguments: pPaperInfo - Point to the paper info which will be fill by this function Return Value: It return a SHORT value which specified the standard paper index in as DMPAPER_xxx Author: 03-Dec-1993 Fri 13:13:42 created -by- Daniel Chou (danielc) Revision History: --*/ { SHORT dmPaperSize; pPaperInfo->ImageArea.left = pPaperInfo->ImageArea.top = 0; if (IsA4PaperDefault()) { dmPaperSize = (SHORT)DMPAPER_A4; pPaperInfo->Size.cx = pPaperInfo->ImageArea.right = DMTOSPL(A4_FORM_CX); pPaperInfo->Size.cy = pPaperInfo->ImageArea.bottom = DMTOSPL(A4_FORM_CY); wcscpy(pPaperInfo->Name, A4_FORM_NAME); PLOTDBG(DBG_DEFPAPER, ("Pick 'A4' paper as default")); } else { dmPaperSize = (SHORT)DMPAPER_LETTER; pPaperInfo->Size.cx = (LONG)_DefPlotDM.dm.dmPaperWidth; pPaperInfo->Size.cy = (LONG)_DefPlotDM.dm.dmPaperLength; dmPaperSize = (SHORT)DMPAPER_LETTER; pPaperInfo->Size.cx = pPaperInfo->ImageArea.right = DMTOSPL(_DefPlotDM.dm.dmPaperWidth); pPaperInfo->Size.cy = pPaperInfo->ImageArea.bottom = DMTOSPL(_DefPlotDM.dm.dmPaperLength); wcscpy(pPaperInfo->Name, _DefPlotDM.dm.dmFormName); PLOTDBG(DBG_DEFPAPER, ("Pick 'Letter' paper as default")); } PLOTDBG(DBG_DEFPAPER, ("SetDefaultPaper: '%ls' (%ld x %ld)", pPaperInfo->Name, pPaperInfo->Size.cx, pPaperInfo->Size.cy)); return(dmPaperSize); }
DWORD MergePLOTDM( HANDLE hPrinter, PPLOTGPC pPlotGPC, PPLOTDEVMODE pPlotDMFrom, PPLOTDEVMODE pPlotDMTo, PFORMSIZE pCurForm ) /*++ Routine Description: This function merge and validate the pPlotDMTo from pPlotDMFrom. The PlotDMOut must valid Arguments: hPrinter - Handle to the printer to be checked pPlotGPC - The plotter's GPC data loaded from the file pPlotDMFrom - pointer to the input PLOTDEVMODE data structure, if can be NULL pPlotDMTo - Pointer to the output PLOTDEVMODE data structure, if pPlotDMFrom is NULL then a default PLOTDEVMODE is returned pCurForm - Pointer to the FORMSIZE data structure which will be updated if the pointer is not NULL, the final result of the form size/imagable area selected by the user will be written to here. the form name will be in pPlotDM->dmFormName. Return Value: the return value is a DWORD dmField error code which specified dmFields are invalid (DM_xxxxx in wingdi.h) if the return value has any DM_INV_xxx bits set then it should raised an error to the user. if return value is 0 then function sucessful Author: 25-Oct-1994 Tue 13:32:18 created -by- Daniel Chou (danielc) Revision History: --*/ { PLOTDEVMODE PlotDMIn; ENUMFORMPARAM EFP; DWORD dmErrFields = 0; SIZEL PaperSize; // // First: set the default PLOTDEVMODE for the output then from there // validate/settting from input devmode, if pwDeviceName passed as // NULL then it assume that pPlotDMTo alreay set and validated // // If we have invalid input devmode then this it is // if ((!pPlotDMFrom) || (!pPlotDMTo) || (!pPlotGPC)) { return(0); } // // Do some conversion here if necessary, first, copy the output one // CopyMemory(&PlotDMIn, pPlotDMTo, sizeof(PLOTDEVMODE)); ConvertDevmode((PDEVMODE) pPlotDMFrom, (PDEVMODE) &PlotDMIn); PLOTDBG(DBG_SHOWDEVMODE, ("--------------- Input DEVMODE Setting -------------------")); PLOTDBG(DBG_SHOWDEVMODE, ("ValidateSetPLOTDM: dmDeviceName = %ls", (DWORD)PlotDMIn.dm.dmDeviceName)); PLOTDBG(DBG_SHOWDEVMODE, ("ValidateSetPLOTDM: dmSpecVersion = %04lx", (DWORD)PlotDMIn.dm.dmSpecVersion)); PLOTDBG(DBG_SHOWDEVMODE, ("ValidateSetPLOTDM: dmDriverVersion = %04lx", (DWORD)PlotDMIn.dm.dmDriverVersion)); PLOTDBG(DBG_SHOWDEVMODE, ("ValidateSetPLOTDM: dmSize = %0ld (%ld)", (DWORD)PlotDMIn.dm.dmSize, sizeof(DEVMODE))); PLOTDBG(DBG_SHOWDEVMODE, ("ValidateSetPLOTDM: dmDriverExtra = %ld (%ld)", (DWORD)PlotDMIn.dm.dmDriverExtra, PLOTDM_PRIV_SIZE)); PLOTDBG(DBG_SHOWDEVMODE, ("ValidateSetPLOTDM: dmFields = %08lx", (DWORD)PlotDMIn.dm.dmFields)); PLOTDBG(DBG_SHOWDEVMODE, ("ValidateSetPLOTDM: dmOrientation = %ld (%hs)", (DWORD)PlotDMIn.dm.dmOrientation, (PlotDMIn.dm.dmFields & DM_ORIENTATION) ? "ON" : "OFF")); PLOTDBG(DBG_SHOWDEVMODE, ("ValidateSetPLOTDM: dmPaperSize = %ld (%hs)", (DWORD)PlotDMIn.dm.dmPaperSize, (PlotDMIn.dm.dmFields & DM_PAPERSIZE) ? "ON" : "OFF")); PLOTDBG(DBG_SHOWDEVMODE, ("ValidateSetPLOTDM: dmPaperLength = %ld (%hs)", (DWORD)PlotDMIn.dm.dmPaperLength, (PlotDMIn.dm.dmFields & DM_PAPERLENGTH) ? "ON" : "OFF")); PLOTDBG(DBG_SHOWDEVMODE, ("ValidateSetPLOTDM: dmPaperWidth = %ld (%hs)", (DWORD)PlotDMIn.dm.dmPaperWidth, (PlotDMIn.dm.dmFields & DM_PAPERWIDTH) ? "ON" : "OFF")); PLOTDBG(DBG_SHOWDEVMODE, ("ValidateSetPLOTDM: dmScale = %ld (%hs)", (DWORD)PlotDMIn.dm.dmScale, (PlotDMIn.dm.dmFields & DM_SCALE) ? "ON" : "OFF")); PLOTDBG(DBG_SHOWDEVMODE, ("ValidateSetPLOTDM: dmCopies = %ld (%hs)", (DWORD)PlotDMIn.dm.dmCopies, (PlotDMIn.dm.dmFields & DM_COPIES) ? "ON" : "OFF")); PLOTDBG(DBG_SHOWDEVMODE, ("ValidateSetPLOTDM: dmPrintQuality = %ld (%hs)", (DWORD)PlotDMIn.dm.dmPrintQuality, (PlotDMIn.dm.dmFields & DM_PRINTQUALITY) ? "ON" : "OFF")); PLOTDBG(DBG_SHOWDEVMODE, ("ValidateSetPLOTDM: dmColor = %ld (%hs)", (DWORD)PlotDMIn.dm.dmColor, (PlotDMIn.dm.dmFields & DM_COLOR) ? "ON" : "OFF")); PLOTDBG(DBG_SHOWDEVMODE, ("ValidateSetPLOTDM: dmFormName = %ls (%hs)", (DWORD)PlotDMIn.dm.dmFormName, (PlotDMIn.dm.dmFields & DM_FORMNAME) ? "ON" : "OFF")); PLOTDBG(DBG_SHOWDEVMODE, ("ValidateSetPLOTDM: Fill Truetype Font = %hs", (PlotDMIn.Flags & PDMF_FILL_TRUETYPE) ? "ON" : "OFF")); PLOTDBG(DBG_SHOWDEVMODE, ("ValidateSetPLOTDM: Plot On the Fly = %hs", (PlotDMIn.Flags & PDMF_PLOT_ON_THE_FLY) ? "ON" : "OFF")); PLOTDBG(DBG_SHOWDEVMODE, ("---------------------------------------------------------")); // // Statring checking the dmFields, *** REMEMBER: The orientation must // check before the checking the paper/form // if (PlotDMIn.dm.dmFields & DM_ORIENTATION) { switch (PlotDMIn.dm.dmOrientation) { case DMORIENT_PORTRAIT: case DMORIENT_LANDSCAPE: pPlotDMTo->dm.dmOrientation = PlotDMIn.dm.dmOrientation; pPlotDMTo->dm.dmFields |= DM_ORIENTATION; break; default: PLOTERR(("ValidatePLOTDM: Invalid dmOrientation = %ld", (LONG)PlotDMIn.dm.dmOrientation)); dmErrFields |= DM_ORIENTATION; break; } } // // Validate form name so we have correct data, assume error first // dmErrFields |= (DWORD)(PlotDMIn.dm.dmFields & DM_PAPER_FIELDS); if (((PlotDMIn.dm.dmFields & DM_PAPER_CUSTOM) == DM_PAPER_CUSTOM) && ((PlotDMIn.dm.dmPaperSize == DMPAPER_USER) || (PlotDMIn.dm.dmPaperSize == 0)) && (PaperSize.cx = DMTOSPL(PlotDMIn.dm.dmPaperWidth)) && (PaperSize.cy = DMTOSPL(PlotDMIn.dm.dmPaperLength)) && (PaperSize.cx >= MIN_SPL_FORM_CX) && (PaperSize.cy >= MIN_SPL_FORM_CY) && (((PaperSize.cx <= pPlotGPC->DeviceSize.cx) && (PaperSize.cy <= pPlotGPC->DeviceSize.cy)) || ((PaperSize.cy <= pPlotGPC->DeviceSize.cx) && (PaperSize.cx <= pPlotGPC->DeviceSize.cy)))) { // // First choice, this is what the caller wants, we need to validate // for this device, since the size may be larger then device can // handle // pPlotDMTo->dm.dmPaperWidth = PlotDMIn.dm.dmPaperWidth; pPlotDMTo->dm.dmPaperLength = PlotDMIn.dm.dmPaperLength; pPlotDMTo->dm.dmFields &= ~DM_PAPER_FIELDS; pPlotDMTo->dm.dmFields |= DM_PAPER_CUSTOM; pPlotDMTo->dm.dmPaperSize = DMPAPER_USER; pPlotDMTo->dm.dmFormName[0] = L'\0'; if (pCurForm) { // // This one is full imageable area as the widht/height // pCurForm->ImageArea.left = pCurForm->ImageArea.top = 0; pCurForm->Size.cx = pCurForm->ImageArea.right = PaperSize.cx; pCurForm->Size.cy = pCurForm->ImageArea.bottom = PaperSize.cy; } dmErrFields &= ~DM_PAPER_FIELDS; // Fine, no error PLOTDBG(DBG_CURFORM,("ValidateSetPLOTDM: FORM=USER <%ld> (%ld x %ld)", PlotDMIn.dm.dmPaperSize, PaperSize.cx, PaperSize.cy)); } else if ((PlotDMIn.dm.dmFields & (DM_PAPERSIZE | DM_FORMNAME)) && (EFP.pPlotDM = pPlotDMTo) && (EFP.pPlotGPC = pPlotGPC) && (PlotEnumForms(hPrinter, NULL, &EFP))) { FORM_INFO_1 *pFI1; SHORT PaperSize; BOOL Found = FALSE; // // Firstable check PaperSize index and if not found then check formname // if ((PlotDMIn.dm.dmFields & DM_PAPERSIZE) && ((PaperSize = PlotDMIn.dm.dmPaperSize) >= DMPAPER_FIRST) && (PaperSize <= (SHORT)EFP.Count) && (pFI1 = EFP.pFI1Base + (PaperSize - DMPAPER_FIRST)) && (pFI1->Flags & FI1F_VALID_SIZE)) { // // Whu..., this guy really pick a right index // Found = TRUE; PLOTDBG(DBG_CURFORM,("ValidateSetPLOTDM: Fount dmPaperSize=%ld", PlotDMIn.dm.dmPaperSize)); } else if (PlotDMIn.dm.dmFields & DM_FORMNAME) { // // Now go through all the formname trouble // pFI1 = EFP.pFI1Base; PaperSize = DMPAPER_FIRST; while (EFP.Count--) { if ((pFI1->Flags & FI1F_VALID_SIZE) && (!wcscmp(pFI1->pName, PlotDMIn.dm.dmFormName))) { PLOTDBG(DBG_CURFORM,("ValidateSetPLOTDM: Found dmFormName=%s", PlotDMIn.dm.dmFormName)); Found = TRUE; break; } ++PaperSize; ++pFI1; } } if (Found) { pPlotDMTo->dm.dmFields &= ~DM_PAPER_FIELDS; pPlotDMTo->dm.dmFields |= (DM_FORMNAME | DM_PAPERSIZE); pPlotDMTo->dm.dmPaperSize = PaperSize; pPlotDMTo->dm.dmPaperWidth = SPLTODM(pFI1->Size.cx); pPlotDMTo->dm.dmPaperLength = SPLTODM(pFI1->Size.cy); WCPYFIELDNAME(pPlotDMTo->dm.dmFormName, pFI1->pName); PLOTDBG(DBG_CURFORM,("FI1 [%ld]: (%ld x %ld), (%ld, %ld)-(%ld, %ld)", (LONG)pPlotDMTo->dm.dmPaperSize, pFI1->Size.cx, pFI1->Size.cy, pFI1->ImageableArea.left, pFI1->ImageableArea.top, pFI1->ImageableArea.right, pFI1->ImageableArea.bottom)); if (pCurForm) { pCurForm->Size = pFI1->Size; pCurForm->ImageArea = pFI1->ImageableArea; } dmErrFields &= ~DM_PAPER_FIELDS; // Fine, no error } // // Free up the memory used // LocalFree((HLOCAL)EFP.pFI1Base); } if ((PlotDMIn.dm.dmFields & DM_SCALE) && (pPlotGPC->MaxScale)) { if ((PlotDMIn.dm.dmScale > 0) && ((WORD)PlotDMIn.dm.dmScale <= pPlotGPC->MaxScale)) { pPlotDMTo->dm.dmScale = PlotDMIn.dm.dmScale; pPlotDMTo->dm.dmFields |= DM_SCALE; } else { PLOTERR(("ValidatePLOTDM: Invalid dmScale = %ld [%ld]", (LONG)PlotDMIn.dm.dmScale, (LONG)pPlotGPC->MaxScale)); dmErrFields |= DM_SCALE; } } if ((PlotDMIn.dm.dmFields & DM_COPIES) && (pPlotGPC->MaxCopies > 1)) { if ((PlotDMIn.dm.dmCopies > 0) && ((WORD)PlotDMIn.dm.dmCopies <= pPlotGPC->MaxCopies)) { pPlotDMTo->dm.dmCopies = PlotDMIn.dm.dmCopies; pPlotDMTo->dm.dmFields |= DM_COPIES; } else { PLOTERR(("ValidatePLOTDM: Invalid dmCopies = %ld [%ld]", (LONG)PlotDMIn.dm.dmCopies, (LONG)pPlotGPC->MaxCopies)); dmErrFields |= DM_COPIES; } } if (PlotDMIn.dm.dmFields & DM_PRINTQUALITY) { dmErrFields |= DM_PRINTQUALITY; // assume error, proven otherwise if (pPlotGPC->MaxQuality) { switch (PlotDMIn.dm.dmPrintQuality) { case DMRES_DRAFT: case DMRES_LOW: case DMRES_MEDIUM: case DMRES_HIGH: dmErrFields &= ~DM_PRINTQUALITY; pPlotDMTo->dm.dmPrintQuality = PlotDMIn.dm.dmPrintQuality; pPlotDMTo->dm.dmFields |= DM_PRINTQUALITY; break; } } if (dmErrFields & DM_PRINTQUALITY) { PLOTERR(("ValidatePLOTDM: Invalid dmPrintQuality = %ld [%ld]", (LONG)PlotDMIn.dm.dmPrintQuality, (LONG)pPlotGPC->MaxQuality)); } } if (PlotDMIn.dm.dmFields & DM_COLOR) { dmErrFields |= DM_COLOR; // assume error, proven otherwise if (pPlotGPC->Flags & PLOTF_COLOR) { switch (PlotDMIn.dm.dmColor) { case DMCOLOR_MONOCHROME: if (!(pPlotGPC->Flags & PLOTF_RASTER)) { PLOTERR(("ValidatePLOTDM: Cannot Set Pen Plotter to MONO")); break; } case DMCOLOR_COLOR: pPlotDMTo->dm.dmColor = PlotDMIn.dm.dmColor; pPlotDMTo->dm.dmFields |= DM_COLOR; dmErrFields &= ~DM_COLOR; break; } } else if (PlotDMIn.dm.dmColor == DMCOLOR_MONOCHROME) { dmErrFields &= ~DM_COLOR; } if (dmErrFields & DM_COLOR) { PLOTERR(("ValidatePLOTDM: Invalid dmColor = %ld [%hs]", (LONG)PlotDMIn.dm.dmColor, (pPlotGPC->Flags & PLOTF_COLOR) ? "COLOR" : "MONO")); } } // // Any other dmFields we just skip because we do not have that caps, now // check if they have correct EXTDEVMODE stuff // if ((PlotDMIn.dm.dmDriverExtra == PLOTDM_PRIV_SIZE) && (PlotDMIn.PrivID == PLOTDM_PRIV_ID) && (PlotDMIn.PrivVer == PLOTDM_PRIV_VER)) { pPlotDMTo->Flags = (DWORD)(PlotDMIn.Flags & PDMF_ALL_BITS); pPlotDMTo->ca = PlotDMIn.ca; if (pPlotGPC->Flags & PLOTF_RASTER) { pPlotDMTo->Flags |= PDMF_FILL_TRUETYPE; } else { // // Non raster device does not have plot on the fly mode // pPlotDMTo->Flags &= ~PDMF_PLOT_ON_THE_FLY; } if (!ValidateColorAdj(&(pPlotDMTo->ca))) { dmErrFields |= DM_INV_PLOTPRIVATE; PLOTERR(("ValidatePLOTDM: Invalid coloradjusment data")); } } return(dmErrFields); }
SHORT GetDefaultPaper( PPAPERINFO pPaperInfo ) /*++ Routine Description: This function compute the default paper name, size. Arguments: pPaperInfo - Point to the paper info which will be fill by this function Return Value: It return a SHORT value which specified the standard paper index in as DMPAPER_xxx Author: 03-Dec-1993 Fri 13:13:42 created Revision History: --*/ { SHORT dmPaperSize; HRESULT hr; if (pPaperInfo == NULL) { return 0; } pPaperInfo->ImageArea.left = pPaperInfo->ImageArea.top = 0; if (IsA4PaperDefault()) { dmPaperSize = (SHORT)DMPAPER_A4; pPaperInfo->Size.cx = pPaperInfo->ImageArea.right = DMTOSPL(A4_FORM_CX); pPaperInfo->Size.cy = pPaperInfo->ImageArea.bottom = DMTOSPL(A4_FORM_CY); hr = StringCchCopy(pPaperInfo->Name, CCHOF(pPaperInfo->Name), A4_FORM_NAME); if (FAILED(hr) ) { PLOTASSERT(0, "Couldn't copy the string %ls to pPaperInfo", SUCCEEDED(hr), A4_FORM_NAME); } PLOTDBG(DBG_DEFPAPER, ("Pick 'A4' paper as default")); } else { dmPaperSize = (SHORT)DMPAPER_LETTER; pPaperInfo->Size.cx = (LONG)_DefPlotDM.dm.dmPaperWidth; pPaperInfo->Size.cy = (LONG)_DefPlotDM.dm.dmPaperLength; dmPaperSize = (SHORT)DMPAPER_LETTER; pPaperInfo->Size.cx = pPaperInfo->ImageArea.right = DMTOSPL(_DefPlotDM.dm.dmPaperWidth); pPaperInfo->Size.cy = pPaperInfo->ImageArea.bottom = DMTOSPL(_DefPlotDM.dm.dmPaperLength); hr = StringCchCopy(pPaperInfo->Name, CCHOF(pPaperInfo->Name), _DefPlotDM.dm.dmFormName); if (FAILED(hr) ) { PLOTASSERT(0, "Couldn't copy the string %ls to pPaperInfo", SUCCEEDED(hr), _DefPlotDM.dm.dmFormName); } PLOTDBG(DBG_DEFPAPER, ("Pick 'Letter' paper as default")); } PLOTDBG(DBG_DEFPAPER, ("SetDefaultPaper: '%ls' (%ld x %ld)", pPaperInfo->Name, pPaperInfo->Size.cx, pPaperInfo->Size.cy)); return(dmPaperSize); }